From 58e03074068d1e28c504c1bf8bde89a5799cb892 Mon Sep 17 00:00:00 2001 From: James Meng Date: Fri, 30 Aug 2024 17:00:57 -0700 Subject: [PATCH] update tests --- .../remote-theme-watcher.test.ts | 44 +++++-------------- .../theme-environment/remote-theme-watcher.ts | 2 +- .../theme-environment.test.ts | 5 +-- .../theme-reconciliation.test.ts | 33 +++++++++++--- 4 files changed, 41 insertions(+), 43 deletions(-) diff --git a/packages/theme/src/cli/utilities/theme-environment/remote-theme-watcher.test.ts b/packages/theme/src/cli/utilities/theme-environment/remote-theme-watcher.test.ts index 4ad1245468..f34edcfea6 100644 --- a/packages/theme/src/cli/utilities/theme-environment/remote-theme-watcher.test.ts +++ b/packages/theme/src/cli/utilities/theme-environment/remote-theme-watcher.test.ts @@ -6,7 +6,7 @@ import {fetchChecksums} from '@shopify/cli-kit/node/themes/api' import {buildTheme} from '@shopify/cli-kit/node/themes/factories' import {ThemeAsset} from '@shopify/cli-kit/node/themes/types' import {DEVELOPMENT_THEME_ROLE} from '@shopify/cli-kit/node/themes/utils' -import {describe, expect, test, vi} from 'vitest' +import {beforeEach, describe, expect, test, vi} from 'vitest' vi.mock('@shopify/cli-kit/node/themes/api') vi.mock('./theme-reconciliation.js') @@ -17,20 +17,22 @@ describe('reconcileAndPollThemeEditorChanges', async () => { const developmentTheme = buildTheme({id: 1, name: 'Theme', role: DEVELOPMENT_THEME_ROLE})! const adminSession = {token: '', storeFqdn: ''} + beforeEach(() => { + vi.mocked(reconcileJsonFiles).mockResolvedValue({ + workPromise: Promise.resolve(), + }) + }) + test('should call pollThemeEditorChanges with updated checksums if the remote theme was been updated during reconciliation', async () => { // Given const files = new Map([]) const defaultThemeFileSystem = fakeThemeFileSystem('tmp', files) const initialRemoteChecksums = [{checksum: '1', key: 'templates/asset.json'}] - vi.mocked(reconcileJsonFiles).mockResolvedValue({ - reconciliationFinishedPromise: Promise.resolve(), - readyForReconciliationPromise: Promise.resolve(), - }) vi.mocked(fetchChecksums).mockResolvedValue([{checksum: '2', key: 'templates/asset.json'}]) // When - await reconcileAndPollThemeEditorChanges( + const {workPromise, updatedRemoteChecksumsPromise} = await reconcileAndPollThemeEditorChanges( developmentTheme, adminSession, initialRemoteChecksums, @@ -41,6 +43,8 @@ describe('reconcileAndPollThemeEditorChanges', async () => { only: [], }, ) + await workPromise + await updatedRemoteChecksumsPromise // Then expect(pollThemeEditorChanges).toHaveBeenCalledWith( @@ -56,34 +60,6 @@ describe('reconcileAndPollThemeEditorChanges', async () => { ) }) - test('should not call reconcileJsonFiles when remote theme contains no files', async () => { - // Given - const files = new Map([]) - const defaultThemeFileSystem = fakeThemeFileSystem('tmp', files) - const emptyRemoteChecksums: [] = [] - const newFileSystem = fakeThemeFileSystem('tmp', new Map([])) - - vi.mocked(fetchChecksums).mockResolvedValue([]) - const readySpy = vi.spyOn(defaultThemeFileSystem, 'ready').mockResolvedValue() - - // When - await reconcileAndPollThemeEditorChanges( - developmentTheme, - adminSession, - emptyRemoteChecksums, - defaultThemeFileSystem, - { - noDelete: false, - ignore: [], - only: [], - }, - ) - - // Then - expect(reconcileJsonFiles).not.toHaveBeenCalled() - expect(pollThemeEditorChanges).toHaveBeenCalled() - }) - test('should wait for the local theme file system to be ready before reconciling', async () => { // Given const files = new Map([]) diff --git a/packages/theme/src/cli/utilities/theme-environment/remote-theme-watcher.ts b/packages/theme/src/cli/utilities/theme-environment/remote-theme-watcher.ts index ca29525af9..a8d7470b73 100644 --- a/packages/theme/src/cli/utilities/theme-environment/remote-theme-watcher.ts +++ b/packages/theme/src/cli/utilities/theme-environment/remote-theme-watcher.ts @@ -29,7 +29,7 @@ export async function reconcileAndPollThemeEditorChanges( outputDebug('Initiating theme asset reconciliation process') await localThemeFileSystem.ready() - const {workPromise} = await reconcileJsonFiles(remoteChecksums, localThemeFileSystem, targetTheme, session, options) + const {workPromise} = await reconcileJsonFiles(targetTheme, session, remoteChecksums, localThemeFileSystem, options) const updatedRemoteChecksumsPromise = workPromise.then(async () => { const updatedRemoteChecksums = await fetchChecksums(targetTheme.id, session) diff --git a/packages/theme/src/cli/utilities/theme-environment/theme-environment.test.ts b/packages/theme/src/cli/utilities/theme-environment/theme-environment.test.ts index 8a381510ff..497f15bd27 100644 --- a/packages/theme/src/cli/utilities/theme-environment/theme-environment.test.ts +++ b/packages/theme/src/cli/utilities/theme-environment/theme-environment.test.ts @@ -105,9 +105,8 @@ describe('setupDevServer', () => { }, } vi.mocked(reconcileAndPollThemeEditorChanges).mockResolvedValue({ - updatedRemoteChecksums: [], - readyForReconciliationPromise: Promise.resolve(), - reconciliationFinishedPromise: Promise.resolve(), + updatedRemoteChecksumsPromise: Promise.resolve([]), + workPromise: Promise.resolve(), }) // When diff --git a/packages/theme/src/cli/utilities/theme-environment/theme-reconciliation.test.ts b/packages/theme/src/cli/utilities/theme-environment/theme-reconciliation.test.ts index 020ab297e8..c6ddcf0704 100644 --- a/packages/theme/src/cli/utilities/theme-environment/theme-reconciliation.test.ts +++ b/packages/theme/src/cli/utilities/theme-environment/theme-reconciliation.test.ts @@ -14,10 +14,10 @@ vi.mock('./theme-fs.js') vi.mock('./theme-downloader.js') vi.mock('./theme-uploader.js') -describe('reconcileThemeFiles', () => { +describe('reconcileJsonFiles', () => { const developmentTheme = buildTheme({id: 1, name: 'Theme', role: DEVELOPMENT_THEME_ROLE})! const adminSession = {token: '', storeFqdn: ''} - const remoteChecksums: Checksum[] = [] + const remoteChecksums: Checksum[] = [{checksum: '1', key: 'config/settings_schema.json'}] const files = new Map([]) const defaultThemeFileSystem = fakeThemeFileSystem('tmp', files) const defaultOptions = {noDelete: false, only: [], ignore: []} @@ -199,7 +199,11 @@ describe('reconcileThemeFiles', () => { ) // Then - expect(renderSelectPrompt).not.toHaveBeenCalled() + expect(renderSelectPrompt).not.toHaveBeenCalledWith( + expect.any(Array), + 'The files listed below are only present locally. What would you like to do?', + expect.any(Object), + ) expect(spy).not.toHaveBeenCalledWith() }) }) @@ -245,9 +249,28 @@ describe('reconcileThemeFiles', () => { expect(fetchThemeAsset).not.toHaveBeenCalled() }) }) + + test('should not perform any work when remote checksums are empty', async () => { + // Given + const files = new Map([]) + const defaultThemeFileSystem = fakeThemeFileSystem('tmp', files) + const emptyRemoteChecksums: Checksum[] = [] + + // When + await reconcileAndWaitForReconciliationFinish( + developmentTheme, + adminSession, + emptyRemoteChecksums, + defaultThemeFileSystem, + defaultOptions, + ) + + // Then + expect(renderSelectPrompt).not.toHaveBeenCalled() + }) }) async function reconcileAndWaitForReconciliationFinish(...args: Parameters) { - const {reconciliationFinishedPromise} = await reconcileJsonFiles(...args) - return reconciliationFinishedPromise + const {workPromise} = await reconcileJsonFiles(...args) + return workPromise }