From 442f1a0c3a0b175f7c696b968b57180b0c1c9a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Colladon?= Date: Thu, 20 Apr 2023 16:39:40 +0200 Subject: [PATCH] refactor: create LWC handler to segregate `isProcessable` algorithm --- .../lib/service/inResourceHandler.test.js | 22 ----- __tests__/unit/lib/service/lwcHandler.test.js | 96 +++++++++++++++++++ src/service/inResourceHandler.js | 10 +- src/service/lwcHandler.js | 13 +++ src/service/typeHandlerFactory.js | 5 +- 5 files changed, 113 insertions(+), 33 deletions(-) create mode 100644 __tests__/unit/lib/service/lwcHandler.test.js create mode 100644 src/service/lwcHandler.js diff --git a/__tests__/unit/lib/service/inResourceHandler.test.js b/__tests__/unit/lib/service/inResourceHandler.test.js index da26d951c..fe7e5b914 100644 --- a/__tests__/unit/lib/service/inResourceHandler.test.js +++ b/__tests__/unit/lib/service/inResourceHandler.test.js @@ -219,26 +219,4 @@ describe('InResourceHandler', () => { }) }) }) - - describe('when the line should not be processed', () => { - it.each([`${basePath}/.eslintrc.json`])( - 'does not handle the line', - async entityPath => { - // Arrange - const sut = new InResourceHandler( - `A ${entityPath}`, - objectType, - work, - globalMetadata - ) - - // Act - await sut.handle() - - // Assert - expect(work.diffs.package.size).toBe(0) - expect(copyFiles).not.toHaveBeenCalled() - } - ) - }) }) diff --git a/__tests__/unit/lib/service/lwcHandler.test.js b/__tests__/unit/lib/service/lwcHandler.test.js new file mode 100644 index 000000000..e99fd9b99 --- /dev/null +++ b/__tests__/unit/lib/service/lwcHandler.test.js @@ -0,0 +1,96 @@ +'use strict' +const LwcHandler = require('../../../../src/service/lwcHandler') +const { copyFiles, readDir } = require('../../../../src/utils/fsHelper') +const { + ADDITION, + DELETION, + MODIFICATION, +} = require('../../../../src/utils/gitConstants') + +jest.mock('../../../../src/utils/fsHelper') + +readDir.mockImplementationOnce(() => Promise.resolve([])) + +const objectType = 'lwc' +const element = 'component' +const basePath = `force-app/main/default/${objectType}` +const entityPath = `${basePath}/${element}/${element}.js` +const xmlName = 'LightningComponentBundle' +let work +beforeEach(() => { + jest.clearAllMocks() + work = { + config: { output: '', repo: '', generateDelta: true }, + diffs: { package: new Map(), destructiveChanges: new Map() }, + } +}) + +describe('lwcHandler', () => { + let globalMetadata + beforeAll(async () => { + // eslint-disable-next-line no-undef + globalMetadata = await getGlobalMetadata() + }) + describe('when the line should not be processed', () => { + it.each([`${basePath}/.eslintrc.json`, `${basePath}/jsconfig.json`])( + 'does not handle the line', + async entityPath => { + // Arrange + const sut = new LwcHandler( + `${ADDITION} ${entityPath}`, + objectType, + work, + globalMetadata + ) + + // Act + await sut.handle() + + // Assert + expect(work.diffs.package.size).toBe(0) + expect(copyFiles).not.toHaveBeenCalled() + } + ) + }) + + describe('when the line should be processed', () => { + it.each([ADDITION, MODIFICATION])( + 'handles the line for "%s" type change', + async changeType => { + // Arrange + const sut = new LwcHandler( + `${changeType} ${entityPath}`, + objectType, + work, + globalMetadata + ) + + // Act + await sut.handle() + + // Assert + expect(work.diffs.package.get(xmlName)).toEqual(new Set([element])) + expect(copyFiles).toHaveBeenCalled() + } + ) + + it('handles the line for "D" type change', async () => { + // Arrange + const sut = new LwcHandler( + `${DELETION} ${entityPath}`, + objectType, + work, + globalMetadata + ) + + // Act + await sut.handle() + + // Assert + expect(work.diffs.destructiveChanges.get(xmlName)).toEqual( + new Set([element]) + ) + expect(copyFiles).not.toHaveBeenCalled() + }) + }) +}) diff --git a/src/service/inResourceHandler.js b/src/service/inResourceHandler.js index 74d644ee5..1e9525f70 100644 --- a/src/service/inResourceHandler.js +++ b/src/service/inResourceHandler.js @@ -3,7 +3,6 @@ const StandardHandler = require('./standardHandler') const { join, parse } = require('path') const { pathExists, readDir } = require('../utils/fsHelper') const { META_REGEX } = require('../utils/metadataConstants') -const { sep } = require('path') const { cleanUpPackageMember } = require('../utils/packageHelper') const STATICRESOURCE_TYPE = 'staticresources' @@ -77,14 +76,7 @@ class ResourceHandler extends StandardHandler { } _isProcessable() { - const parsedLine = parse(this.line) - const parentFolder = parsedLine.dir.split(sep).pop() - - return ( - super._isProcessable() || - parentFolder !== this.type || - !parsedLine.name.startsWith('.') - ) + return true } } diff --git a/src/service/lwcHandler.js b/src/service/lwcHandler.js new file mode 100644 index 000000000..961100a00 --- /dev/null +++ b/src/service/lwcHandler.js @@ -0,0 +1,13 @@ +'use strict' +const InResourceHandler = require('./inResourceHandler') +const { parse, sep } = require('path') + +class LwcHandler extends InResourceHandler { + _isProcessable() { + const parentFolder = parse(this.line).dir.split(sep).pop() + + return parentFolder !== this.type + } +} + +module.exports = LwcHandler diff --git a/src/service/typeHandlerFactory.js b/src/service/typeHandlerFactory.js index 94479ada7..8f77e5a4d 100644 --- a/src/service/typeHandlerFactory.js +++ b/src/service/typeHandlerFactory.js @@ -5,6 +5,7 @@ const InBundleHandler = require('./inBundleHandler') const InFile = require('./inFileHandler') const InFolder = require('./inFolderHandler') const InResource = require('./inResourceHandler') +const LwcHandler = require('./lwcHandler') const Standard = require('./standardHandler') const SubCustomObject = require('./subCustomObjectHandler') const ObjectTranslation = require('./ObjectTranslationHandler') @@ -15,7 +16,7 @@ const { getType } = require('../utils/typeUtils') const classes = { assignmentRules: InFile, autoResponseRules: InFile, - aura: InResource, + aura: LwcHandler, bots: Bot, businessProcesses: SubCustomObject, compactLayouts: SubCustomObject, @@ -32,7 +33,7 @@ const classes = { indexes: SubCustomObject, labels: InFile, listViews: SubCustomObject, - lwc: InResource, + lwc: LwcHandler, matchingRules: InFile, objects: CustomObject, objectTranslations: ObjectTranslation,