diff --git a/package-lock.json b/package-lock.json index 312acb9..eb76c97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,10 @@ }, "devDependencies": { "@jest/globals": "^29.7.0", + "@types/mock-fs": "^4.13.4", "@types/node": "^20.8.2", "jest": "^29.7.0", + "mock-fs": "^5.2.0", "prettier": "^3.0.3", "ts-jest": "^29.1.2", "typescript": "^5.2.2", @@ -1343,6 +1345,15 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/mock-fs": { + "version": "4.13.4", + "resolved": "https://registry.npmjs.org/@types/mock-fs/-/mock-fs-4.13.4.tgz", + "integrity": "sha512-mXmM0o6lULPI8z3XNnQCpL0BGxPwx1Ul1wXYEPBGl4efShyxW2Rln0JOPEWGyZaYZMM6OVXM/15zUuFMY52ljg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "20.12.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", @@ -3199,6 +3210,15 @@ "node": "*" } }, + "node_modules/mock-fs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-5.2.0.tgz", + "integrity": "sha512-2dF2R6YMSZbpip1V1WHKGLNjr/k48uQClqMVb5H3MOvwc9qhYis3/IWbj02qIg/Y8MDXKFF4c5v0rxx2o6xTZw==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", diff --git a/package.json b/package.json index 2ea7380..a08170c 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,10 @@ }, "devDependencies": { "@jest/globals": "^29.7.0", + "@types/mock-fs": "^4.13.4", "@types/node": "^20.8.2", "jest": "^29.7.0", + "mock-fs": "^5.2.0", "prettier": "^3.0.3", "ts-jest": "^29.1.2", "typescript": "^5.2.2", diff --git a/src/utils.ts b/src/utils.ts index 3509173..ec67afe 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -18,7 +18,7 @@ export function initializePluginConfig( } export function readJsonFile(file: string): any { - return JSON.parse(readFileSync(file, "utf-8")) || {}; + return JSON.parse(readFileSync(file, "utf-8")); } export function isComposerRoot(file: string): boolean { diff --git a/test/fixtures/projectComposerFile.json b/test/fixtures/composerProject/composer.json similarity index 100% rename from test/fixtures/projectComposerFile.json rename to test/fixtures/composerProject/composer.json diff --git a/test/fixtures/extensionComposerFile.json b/test/fixtures/composerProject/packages/composerExtension/composer.json similarity index 100% rename from test/fixtures/extensionComposerFile.json rename to test/fixtures/composerProject/packages/composerExtension/composer.json diff --git a/test/fixtures/composerProject/vendor/composer/installed.json b/test/fixtures/composerProject/vendor/composer/installed.json new file mode 100644 index 0000000..ba375f0 --- /dev/null +++ b/test/fixtures/composerProject/vendor/composer/installed.json @@ -0,0 +1,5 @@ +{ + "packages": [ + + ] +} diff --git a/test/fixtures/libraryComposerFile.json b/test/fixtures/composerProject/vendor/namespace/library/composer.json similarity index 100% rename from test/fixtures/libraryComposerFile.json rename to test/fixtures/composerProject/vendor/namespace/library/composer.json diff --git a/test/fixtures/nonComposerProject/typo3conf/ext/non_composer_extension/.gitkeep b/test/fixtures/nonComposerProject/typo3conf/ext/non_composer_extension/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/utils.test.ts b/test/utils.test.ts index c85e9aa..e7bd24c 100644 --- a/test/utils.test.ts +++ b/test/utils.test.ts @@ -1,27 +1,76 @@ -import { describe, expect, test } from "@jest/globals"; -import { isComposerRoot } from "../src/utils"; +import { describe, expect, test, beforeAll, afterAll } from "@jest/globals"; +import { determineComposerRoot, isComposerRoot, readJsonFile } from "../src/utils"; import { resolve } from "node:path"; +import mockFs from "mock-fs"; -describe("utils module", () => { - test("checks projectComposerFile.json to be valid root composer file", () => { +beforeAll(() => { + mockFs({ + "/path/to/fixtures": mockFs.load(resolve(__dirname, "fixtures")) + }); +}) +afterAll(() => { + mockFs.restore(); +}) + +describe("isComposerRoot", () => { + test("checks project composer.json to be valid root composer file", () => { expect( - isComposerRoot( - resolve(__dirname, "fixtures/projectComposerFile.json"), - ), + isComposerRoot("/path/to/fixtures/composerProject/composer.json") ).toBe(true); }); - test("checks extensionComposerFile.json to be invalid root composer file", () => { + test("checks extension composer.json to be invalid root composer file", () => { expect( - isComposerRoot( - resolve(__dirname, "fixtures/extensionComposerFile.json"), - ), + isComposerRoot("/path/to/fixtures/composerProject/packages/composerExtension/composer.json") ).toBe(false); }); - test("checks libraryComposerFile.json to be invalid root composer file", () => { + test("checks library composer.json to be invalid root composer file", () => { expect( - isComposerRoot( - resolve(__dirname, "fixtures/libraryComposerFile.json"), - ), + isComposerRoot("/path/to/fixtures/composerProject/vendor/namespace/library/composer.json") ).toBe(false); }); }); + +describe("readJsonFile", () => { + test("reads composer.json as json", () => { + expect( + readJsonFile("/path/to/fixtures/composerProject/vendor/namespace/library/composer.json") + ).toEqual({"type": "library"}); + }); +}); + +describe("determineComposerRoot", () => { + test("determines composer root from extension path", () => { + expect( + determineComposerRoot("/path/to/fixtures/composerProject/packages/composerExtension") + ).toBe("/path/to/fixtures/composerProject"); + }); + test("determines composer root from library path", () => { + expect( + determineComposerRoot("/path/to/fixtures/composerProject/vendor/namespace/library") + ).toBe("/path/to/fixtures/composerProject"); + }); + test("determines composer root from root path", () => { + expect( + determineComposerRoot("/path/to/fixtures/composerProject") + ).toBe("/path/to/fixtures/composerProject"); + }); + test("determines composer root from other path", () => { + expect( + determineComposerRoot("/path/to/fixtures/composerProject/packages") + ).toBe("/path/to/fixtures/composerProject"); + }); + + test("fail to determine composer root from extension path", () => { + expect( + determineComposerRoot("/path/to/fixtures/nonComposerProject/typo3conf/ext/non_composer_extension") + ).toBe("/path/to/fixtures/nonComposerProject/typo3conf/ext/non_composer_extension"); + }); + test("fail to determine composer root from extension path with fallback root specified", () => { + expect( + determineComposerRoot( + "/path/to/fixtures/nonComposerProject/typo3conf/ext/non_composer_extension", + "/path/to/fixtures/nonComposerProject", + ) + ).toBe("/path/to/fixtures/nonComposerProject"); + }); +});