Skip to content

Commit e6015c0

Browse files
committed
changed return to null and improved test coverage
- added wildcard major versions - updated test for null return - added invalid json test case
1 parent 1ced35a commit e6015c0

File tree

2 files changed

+51
-58
lines changed

2 files changed

+51
-58
lines changed

src/options.mjs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ import path from "path";
44
const CATEGORY_PHP = "PHP";
55

66
/**
7-
* Detect minimum PHP version from the composer.json file
8-
* @param def {string} Default PHP version to use if not found
9-
* @return {string} The PHP version to use in the composer.json file.
7+
* Detect the minimum PHP version from the composer.json file
8+
* @return {string|null} The PHP version to use in the composer.json file, null when not found
109
*/
11-
function getComposerPhpVer(def) {
10+
function getComposerPhpVer() {
1211
// Try to find composer.json
1312
const currentDir = process.cwd();
1413
let composerPath = null;
@@ -36,6 +35,14 @@ function getComposerPhpVer(def) {
3635
const composerJson = JSON.parse(fileContent);
3736

3837
if (composerJson.require && composerJson.require.php) {
38+
// Check for wildcard pattern like "7.*"
39+
const wildcardMatch = composerJson.require.php.match(
40+
/^(?:[^0-9]*)?([0-9]+)\.\*/
41+
);
42+
if (wildcardMatch) {
43+
return `${wildcardMatch[1]}.0`;
44+
}
45+
3946
// Extract version from composer semver format
4047
const versionMatch = composerJson.require.php.match(
4148
/^(?:[^0-9]*)?([0-9]+)\.([0-9]+)/
@@ -45,12 +52,12 @@ function getComposerPhpVer(def) {
4552
return `${versionMatch[1]}.${versionMatch[2]}`;
4653
}
4754
}
48-
} catch (error) {
49-
return def;
55+
} catch (e) {
56+
// Ignore JSON parsing errors
5057
}
5158
}
5259

53-
return def;
60+
return null;
5461
}
5562

5663
export { getComposerPhpVer };
@@ -60,7 +67,7 @@ export default {
6067
since: "0.13.0",
6168
category: CATEGORY_PHP,
6269
type: "choice",
63-
default: getComposerPhpVer("8.3"),
70+
default: getComposerPhpVer() ?? "8.3",
6471
description: "Minimum target PHP version.",
6572
choices: [
6673
{ value: "5.0" },

tests/composer-version/composer-version.spec.mjs

Lines changed: 36 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -44,69 +44,42 @@ describe("getComposerPhpVer", () => {
4444
}
4545
});
4646

47-
test("returns default value when no composer.json is found", () => {
47+
test("returns null when no composer.json is found", () => {
4848
// Create a directory with no composer.json
4949
const emptyDir = path.join(tempDir, "empty-dir");
5050
fs.mkdirSync(emptyDir, { recursive: true });
5151

5252
process.chdir(emptyDir);
5353

54-
const defaultVersion = "7.4";
55-
expect(getComposerPhpVer(defaultVersion)).toBe(defaultVersion);
54+
expect(getComposerPhpVer()).toBe(null);
5655
});
5756

5857
test.each([
59-
[">=7.1.0", "7.1"],
60-
["^8.0", "8.0"],
61-
["~7.4", "7.4"],
62-
[">=5.6.0 <8.0.0", "5.6"],
63-
["7.3.*", "7.3"]
64-
])("extracts correct version from %s", (versionConstraint, expectedVersion) => {
58+
{ver:">=7.1.0",expected: "7.1"},
59+
{ver:"^8.0",expected: "8.0"},
60+
{ver:"~7.4",expected: "7.4"},
61+
{ver:">=5.6.0 <8.0.0",expected: "5.6"},
62+
{ver:"7.3.*",expected: "7.3"},
63+
{ver:"7.* || 8.*",expected: "7.0"}
64+
])("extracts correct version from $ver ba changing cwd", ({ver, expected}) => {
6565
const composerContent = JSON.stringify(
6666
{
6767
require: {
68-
php: versionConstraint,
68+
php: ver,
6969
},
7070
},
7171
null,
7272
2
7373
);
7474

75-
fs.writeFileSync(tempComposerPath, composerContent);
76-
7775
process.chdir(tempDir);
78-
79-
// Call getComposerPhpVer to test version extraction
80-
const result = getComposerPhpVer("default");
81-
expect(result).toBe(expectedVersion);
82-
});
83-
84-
test.each([
85-
[">=7.1.0", "7.1"],
86-
["^8.0", "8.0"],
87-
["~7.4", "7.4"],
88-
[">=5.6.0 <8.0.0", "5.6"],
89-
["7.3.*", "7.3"]
90-
])("extracts correct version from %s by changing cwd", (versionConstraint, expectedVersion) => {
91-
const composerContent = JSON.stringify(
92-
{
93-
require: {
94-
php: versionConstraint,
95-
},
96-
},
97-
null,
98-
2
99-
);
100-
10176
fs.writeFileSync(tempComposerPath, composerContent);
10277

103-
process.chdir(tempDir);
10478

105-
const result = getComposerPhpVer("default");
106-
expect(result).toBe(expectedVersion);
79+
expect(getComposerPhpVer()).toBe(expected);
10780
});
10881

109-
test("returns default when composer.json has no PHP requirement", () => {
82+
test("returns null when composer.json has no PHP requirement", () => {
11083
const composerContent = JSON.stringify(
11184
{
11285
require: {
@@ -122,12 +95,10 @@ describe("getComposerPhpVer", () => {
12295

12396
process.chdir(tempDir);
12497

125-
const defaultVersion = "8.3";
126-
const result = getComposerPhpVer(defaultVersion);
127-
expect(result).toBe(defaultVersion);
98+
expect(getComposerPhpVer()).toBe(null);
12899
});
129100

130-
test("returns default when composer.json has invalid PHP requirement", () => {
101+
test("returns null when composer.json has invalid PHP requirement", () => {
131102
const composerContent = JSON.stringify(
132103
{
133104
require: {
@@ -142,9 +113,7 @@ describe("getComposerPhpVer", () => {
142113

143114
process.chdir(tempDir);
144115

145-
const defaultVersion = "8.3";
146-
const result = getComposerPhpVer(defaultVersion);
147-
expect(result).toBe(defaultVersion);
116+
expect(getComposerPhpVer()).toBe(null);
148117
});
149118

150119
test("finds composer.json in parent directory when in nested child folder", () => {
@@ -172,8 +141,7 @@ describe("getComposerPhpVer", () => {
172141

173142
process.chdir(nestedDir3);
174143

175-
const result = getComposerPhpVer("default");
176-
expect(result).toBe("8.1");
144+
expect(getComposerPhpVer()).toBe("8.1");
177145
});
178146

179147
test("finds composer.json in intermediate parent directory", () => {
@@ -202,7 +170,25 @@ describe("getComposerPhpVer", () => {
202170

203171
process.chdir(nestedDir3);
204172

205-
const result = getComposerPhpVer("default");
206-
expect(result).toBe("7.2");
173+
expect(getComposerPhpVer()).toBe("7.2");
174+
});
175+
176+
test("returns null when composer.json is malformed", () => {
177+
// Create a malformed JSON file (invalid syntax)
178+
const malformedContent = `{
179+
"name": "test/package",
180+
"require": {
181+
"php": "^7.4"
182+
}, // Invalid trailing comma
183+
"extra": {
184+
"key": "value"
185+
}
186+
}`;
187+
188+
fs.writeFileSync(tempComposerPath, malformedContent);
189+
190+
process.chdir(tempDir);
191+
192+
expect(getComposerPhpVer()).toBe(null);
207193
});
208194
});

0 commit comments

Comments
 (0)