Skip to content

Commit

Permalink
fix: copy empty metadata file not deployable (#667)
Browse files Browse the repository at this point in the history
  • Loading branch information
scolladon committed Aug 8, 2023
1 parent e348a75 commit 2d5c60c
Show file tree
Hide file tree
Showing 9 changed files with 419 additions and 385 deletions.
2 changes: 1 addition & 1 deletion __tests__/functional/delta.nut.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ describe('sgd:source:delta NUTS', () => {
const packageLineCount = await getFileLineNumber(
'e2e/expected/package/package.xml'
)
expect(packageLineCount).to.equal(194)
expect(packageLineCount).to.equal(209)
expect(result).to.include('"error": null')
expect(result).to.include('"success": true')
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ describe('ObjectTranslation', () => {
await sut.handleAddition()

// Assert

expect(copyFiles).not.toBeCalled()
expect(writeFile).toBeCalledTimes(1)
expect(writeFile).toHaveBeenCalledWith(
expect.stringContaining('Account-es.objectTranslation'),
Expand Down
97 changes: 65 additions & 32 deletions __tests__/unit/lib/service/inFileHandler.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ describe.each([true, false])(`inFileHandler`, generateDelta => {
work,
globalMetadata
)
mockCompare.mockReturnValue({
mockCompare.mockResolvedValue({
added: new Map([['WorkflowAlert', new Set(['test'])]]),
deleted: new Map(),
})
Expand Down Expand Up @@ -76,7 +76,7 @@ describe.each([true, false])(`inFileHandler`, generateDelta => {
work,
globalMetadata
)
mockCompare.mockReturnValue({
mockCompare.mockResolvedValue({
added: new Map([['ValueTranslation', new Set(['Three'])]]),
deleted: new Map(),
})
Expand Down Expand Up @@ -105,39 +105,72 @@ describe.each([true, false])(`inFileHandler`, generateDelta => {

describe('when file is modified', () => {
let sut
beforeEach(() => {
// Arrange
sut = new InFile(
'force-app/main/default/workflows/Test/Account.workflow-meta.xml',
'workflows',
work,
globalMetadata
)
mockCompare.mockReturnValue({
added: new Map([['WorkflowAlert', new Set(['test'])]]),
deleted: new Map([['WorkflowAlert', new Set(['deleted'])]]),

describe('when element are added and deleted', () => {
beforeEach(() => {
// Arrange
sut = new InFile(
'force-app/main/default/workflows/Test/Account.workflow-meta.xml',
'workflows',
work,
globalMetadata
)
mockCompare.mockResolvedValue({
added: new Map([['WorkflowAlert', new Set(['test'])]]),
deleted: new Map([['WorkflowAlert', new Set(['deleted'])]]),
})
})
it('should store the added metadata in the package and deleted in the destructiveChanges', async () => {
// Act
await sut.handleModification()

// Assert
expect(work.diffs.package.get('Workflow')).toEqual(new Set(['Account']))
expect(work.diffs.package.get('WorkflowAlert')).toEqual(
new Set(['Account.test'])
)
expect(work.diffs.destructiveChanges.get('WorkflowAlert')).toEqual(
new Set(['Account.deleted'])
)
expect(work.diffs.destructiveChanges.has('Workflow')).toBe(false)
if (generateDelta) {
expect(mockprune).toHaveBeenCalled()
expect(writeFile).toHaveBeenCalled()
} else {
expect(mockprune).not.toHaveBeenCalled()
expect(writeFile).not.toHaveBeenCalled()
}
})
})
it('should store the added metadata in the package and deleted in the destructiveChanges', async () => {
// Act
await sut.handleModification()

// Assert
expect(work.diffs.package.get('Workflow')).toEqual(new Set(['Account']))
expect(work.diffs.package.get('WorkflowAlert')).toEqual(
new Set(['Account.test'])
)
expect(work.diffs.destructiveChanges.get('WorkflowAlert')).toEqual(
new Set(['Account.deleted'])
)
expect(work.diffs.destructiveChanges.has('Workflow')).toBe(false)
if (generateDelta) {
expect(mockprune).toHaveBeenCalled()
expect(writeFile).toHaveBeenCalled()
} else {
describe('when element are deleted and nothing is added', () => {
beforeEach(() => {
// Arrange
sut = new InFile(
'force-app/main/default/workflows/Test/Account.workflow-meta.xml',
'workflows',
work,
globalMetadata
)
mockCompare.mockResolvedValue({
added: new Map(),
deleted: new Map([['WorkflowAlert', new Set(['deleted'])]]),
})
})
it('should store the deleted in the destructiveChanges and not copy the file', async () => {
// Act
await sut.handleModification()

// Assert
expect(work.diffs.package.get('Workflow')).toEqual(new Set(['Account']))
expect(work.diffs.package.get('WorkflowAlert')).toBeUndefined()
expect(work.diffs.destructiveChanges.get('WorkflowAlert')).toEqual(
new Set(['Account.deleted'])
)
expect(work.diffs.destructiveChanges.has('Workflow')).toBe(false)
expect(mockprune).not.toHaveBeenCalled()
expect(writeFile).not.toHaveBeenCalled()
}
})
})

describe('when metadata in file is not packable', () => {
Expand All @@ -149,7 +182,7 @@ describe.each([true, false])(`inFileHandler`, generateDelta => {
work,
globalMetadata
)
mockCompare.mockReturnValue({
mockCompare.mockResolvedValue({
added: new Map([['ValueTranslation', new Set(['Three'])]]),
deleted: new Map(),
})
Expand Down Expand Up @@ -186,7 +219,7 @@ describe.each([true, false])(`inFileHandler`, generateDelta => {
work,
globalMetadata
)
mockCompare.mockReturnValue({
mockCompare.mockResolvedValue({
added: new Map(),
deleted: new Map([['WorkflowAlert', new Set(['test'])]]),
})
Expand Down
20 changes: 10 additions & 10 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"author": "Sebastien Colladon <[email protected]>",
"dependencies": {
"@salesforce/command": "^5.3.9",
"fast-xml-parser": "^4.2.6",
"fast-xml-parser": "^4.2.7",
"fs-extra": "^11.1.1",
"ignore": "^5.2.4",
"lodash": "^4.17.21",
Expand Down Expand Up @@ -67,32 +67,32 @@
"@commitlint/cli": "^17.6.7",
"@commitlint/config-conventional": "^17.6.7",
"@oclif/dev-cli": "^1.26.10",
"@salesforce/cli-plugins-testkit": "^4.2.7",
"@salesforce/cli-plugins-testkit": "^4.2.8",
"@salesforce/dev-config": "^4.0.1",
"@salesforce/ts-sinon": "^1.4.12",
"@salesforce/ts-sinon": "^1.4.13",
"@stryker-mutator/core": "^7.1.1",
"@stryker-mutator/jest-runner": "^7.1.1",
"@swc/core": "^1.3.71",
"@swc/core": "^1.3.74",
"@types/mocha": "^10.0.1",
"@types/node": "^20.4.5",
"@typescript-eslint/parser": "^6.2.0",
"@types/node": "^20.4.8",
"@typescript-eslint/parser": "^6.2.1",
"benchmark": "^2.1.4",
"chai": "^4.3.7",
"depcheck": "^1.4.3",
"eslint": "^8.45.0",
"eslint-config-prettier": "^8.9.0",
"eslint": "^8.46.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-prettier": "^5.0.0",
"husky": "^8.0.3",
"jest": "^29.6.2",
"lint-staged": "^13.2.3",
"mocha": "^10.2.0",
"nyc": "^15.1.0",
"prettier": "^3.0.0",
"prettier": "^3.0.1",
"shx": "^0.3.4",
"sinon": "^15.2.0",
"ts-node": "^10.9.1",
"typescript": "^5.1.6",
"yarn-audit-fix": "^9.3.12",
"yarn-audit-fix": "^10.0.0",
"yarn-upgrade-all": "^0.7.2"
},
"oclif": {
Expand Down
6 changes: 5 additions & 1 deletion src/service/ObjectTranslationHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,15 @@ class ObjectTranslationHandler extends ResourceHandler {

getObjectTranslationPath() {
// Return Object Translation Path for both objectTranslation and fieldTranslation
// QUESTION: Why fieldTranslation element are not deployable when objectTranslation element is not in the deployed sources ?
// QUESTION: Why fieldTranslation element are not deployable when objectTranslation element is not in the deployed sources (even if objectTranslation file is empty) ?
return `${parse(this.line).dir}${sep}${
this.splittedLine[this.splittedLine.length - 2]
}.${OBJECT_TRANSLATION_META_XML_SUFFIX}`
}

_delegateFileCopy() {
return !this.line.endsWith(OBJECT_TRANSLATION_META_XML_SUFFIX)
}
}

module.exports = ObjectTranslationHandler
4 changes: 2 additions & 2 deletions src/service/botHandler.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
'use strict'
const ShareFolderHandler = require('./sharedFolderHandler')
const SharedFolderHandler = require('./sharedFolderHandler')
const { fillPackageWithParameter } = require('../utils/packageHelper')
const { parse, sep } = require('path')

const BOT_TYPE = 'Bot'
const BOT_EXTENSION = 'bot'

class BotHandler extends ShareFolderHandler {
class BotHandler extends SharedFolderHandler {
_getElementName() {
const parsedPath = this._getParsedPath()
const elementName = new Set([
Expand Down
11 changes: 9 additions & 2 deletions src/service/inFileHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,16 @@ class InFileHandler extends StandardHandler {

async _compareRevision() {
const { added, deleted } = await this.metadataDiff.compare(this.line)
this._addedMembers = added
this._storeComparison(this.diffs.destructiveChanges, deleted)
this._storeComparison(this.diffs.package, added)
}

async _writeScopedContent() {
const xmlContent = this.metadataDiff.prune()
await writeFile(this.line, xmlContent, this.config)
if (this._addedMembers.size > 0) {
const xmlContent = this.metadataDiff.prune()
await writeFile(this.line, xmlContent, this.config)
}
}

_storeComparison(store, content) {
Expand Down Expand Up @@ -88,6 +91,10 @@ class InFileHandler extends StandardHandler {
})
}
}

_delegateFileCopy() {
return false
}
}

module.exports = InFileHandler
18 changes: 12 additions & 6 deletions src/service/standardHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,12 +99,14 @@ class StandardHandler {
}

async _copyWithMetaFile(src) {
await copyFiles(this.config, src)
if (
this.metadata.get(this.type).metaFile === true &&
!`${src}`.endsWith(METAFILE_SUFFIX)
) {
await copyFiles(this.config, this._getMetaTypeFilePath(src))
if (this._delegateFileCopy()) {
await copyFiles(this.config, src)
if (
this.metadata.get(this.type).metaFile === true &&
!`${src}`.endsWith(METAFILE_SUFFIX)
) {
await copyFiles(this.config, this._getMetaTypeFilePath(src))
}
}
}

Expand Down Expand Up @@ -136,6 +138,10 @@ class StandardHandler {
_isProcessable() {
return this.metadata.get(this.type).suffix === this.ext
}

_delegateFileCopy() {
return true
}
}

module.exports = StandardHandler
Loading

0 comments on commit 2d5c60c

Please sign in to comment.