mirror of
https://github.com/astral-sh/setup-uv.git
synced 2026-02-15 13:51:45 +00:00
Remove unit tests and extend test-specific-version with resolution-strategy matrix
Co-authored-by: eifinger <1481961+eifinger@users.noreply.github.com>
This commit is contained in:
parent
e421cf46a9
commit
a2d9fd60e7
5 changed files with 11 additions and 156 deletions
12
.github/workflows/test.yml
vendored
12
.github/workflows/test.yml
vendored
|
|
@ -111,15 +111,25 @@ jobs:
|
||||||
expected-version: "0.3.5"
|
expected-version: "0.3.5"
|
||||||
- version-input: ">=0.4.25,<0.5"
|
- version-input: ">=0.4.25,<0.5"
|
||||||
expected-version: "0.4.30"
|
expected-version: "0.4.30"
|
||||||
|
- version-input: ">=0.4.25,<0.5"
|
||||||
|
expected-version: "0.4.25"
|
||||||
|
resolution-strategy: "lowest"
|
||||||
|
- version-input: ">=0.1.0,<0.2"
|
||||||
|
expected-version: "0.1.19"
|
||||||
|
resolution-strategy: "highest"
|
||||||
|
- version-input: ">=0.1.0,<0.2"
|
||||||
|
expected-version: "0.1.0"
|
||||||
|
resolution-strategy: "lowest"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install version ${{ matrix.input.version-input }}
|
- name: Install version ${{ matrix.input.version-input }} with strategy ${{ matrix.input.resolution-strategy || 'highest' }}
|
||||||
id: setup-uv
|
id: setup-uv
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
version: ${{ matrix.input.version-input }}
|
version: ${{ matrix.input.version-input }}
|
||||||
|
resolution-strategy: ${{ matrix.input.resolution-strategy || 'highest' }}
|
||||||
- name: Correct version gets installed
|
- name: Correct version gets installed
|
||||||
run: |
|
run: |
|
||||||
if [ "$(uv --version)" != "uv ${{ matrix.input.expected-version }}" ]; then
|
if [ "$(uv --version)" != "uv ${{ matrix.input.expected-version }}" ]; then
|
||||||
|
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
# Resolution Strategy Demo
|
|
||||||
|
|
||||||
This file demonstrates the new `resolution-strategy` input.
|
|
||||||
|
|
||||||
## Default behavior (highest strategy)
|
|
||||||
```yaml
|
|
||||||
- name: Install highest compatible uv version
|
|
||||||
uses: astral-sh/setup-uv@v6
|
|
||||||
with:
|
|
||||||
version: ">=0.4.0"
|
|
||||||
# resolution-strategy: "highest" is the default
|
|
||||||
```
|
|
||||||
|
|
||||||
## Lowest strategy for testing compatibility
|
|
||||||
```yaml
|
|
||||||
- name: Install lowest compatible uv version
|
|
||||||
uses: astral-sh/setup-uv@v6
|
|
||||||
with:
|
|
||||||
version: ">=0.4.0"
|
|
||||||
resolution-strategy: "lowest"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Use case: Testing with matrix of strategies
|
|
||||||
```yaml
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
resolution-strategy: ["highest", "lowest"]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
- name: Install uv with ${{ matrix.resolution-strategy }} strategy
|
|
||||||
uses: astral-sh/setup-uv@v6
|
|
||||||
with:
|
|
||||||
version: ">=0.4.0"
|
|
||||||
resolution-strategy: ${{ matrix.resolution-strategy }}
|
|
||||||
cache-suffix: ${{ matrix.resolution-strategy }}
|
|
||||||
- name: Test with strategy
|
|
||||||
run: |
|
|
||||||
echo "Testing with $(uv --version)"
|
|
||||||
uv run --frozen pytest
|
|
||||||
```
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
import { describe, expect, it } from "@jest/globals";
|
|
||||||
|
|
||||||
describe("resolution strategy logic", () => {
|
|
||||||
it("should have correct string values for resolution strategy", () => {
|
|
||||||
// Test the string literal types are correct
|
|
||||||
const strategies: Array<"highest" | "lowest"> = ["highest", "lowest"];
|
|
||||||
expect(strategies).toHaveLength(2);
|
|
||||||
expect(strategies).toContain("highest");
|
|
||||||
expect(strategies).toContain("lowest");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should validate resolution strategy values", () => {
|
|
||||||
const validStrategies = ["highest", "lowest"];
|
|
||||||
const invalidStrategies = ["invalid", "HIGHEST", "LOWEST", "middle"];
|
|
||||||
|
|
||||||
for (const strategy of validStrategies) {
|
|
||||||
expect(["highest", "lowest"]).toContain(strategy);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const strategy of invalidStrategies) {
|
|
||||||
expect(["highest", "lowest"]).not.toContain(strategy);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
import { describe, expect, it } from "@jest/globals";
|
|
||||||
|
|
||||||
describe("resolution strategy integration test", () => {
|
|
||||||
it("should choose max satisfying version for highest strategy", () => {
|
|
||||||
// Test the logic that chooses between max/min satisfying
|
|
||||||
const versions = ["0.1.0", "0.2.0", "0.3.0"];
|
|
||||||
|
|
||||||
// Simulate the logic from our implementation
|
|
||||||
const strategyLogic = (strategy: "highest" | "lowest") => {
|
|
||||||
// This simulates what semver.minSatisfying and semver.maxSatisfying would return
|
|
||||||
if (strategy === "lowest") {
|
|
||||||
return versions.find((v) => v >= "0.1.0"); // First match (lowest)
|
|
||||||
} else {
|
|
||||||
return versions.filter((v) => v >= "0.1.0").pop(); // Last match (highest)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
expect(strategyLogic("highest")).toBe("0.3.0");
|
|
||||||
expect(strategyLogic("lowest")).toBe("0.1.0");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should validate resolution strategy values correctly", () => {
|
|
||||||
const getResolutionStrategy = (input: string): "highest" | "lowest" => {
|
|
||||||
if (input === "lowest") {
|
|
||||||
return "lowest";
|
|
||||||
}
|
|
||||||
if (input === "highest" || input === "") {
|
|
||||||
return "highest";
|
|
||||||
}
|
|
||||||
throw new Error(
|
|
||||||
`Invalid resolution-strategy: ${input}. Must be 'highest' or 'lowest'.`,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
expect(getResolutionStrategy("")).toBe("highest");
|
|
||||||
expect(getResolutionStrategy("highest")).toBe("highest");
|
|
||||||
expect(getResolutionStrategy("lowest")).toBe("lowest");
|
|
||||||
|
|
||||||
expect(() => getResolutionStrategy("invalid")).toThrow(
|
|
||||||
"Invalid resolution-strategy: invalid. Must be 'highest' or 'lowest'.",
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
jest.mock("@actions/core", () => {
|
|
||||||
return {
|
|
||||||
debug: jest.fn(),
|
|
||||||
getBooleanInput: jest.fn(
|
|
||||||
(name: string) => (mockInputs[name] ?? "") === "true",
|
|
||||||
),
|
|
||||||
getInput: jest.fn((name: string) => mockInputs[name] ?? ""),
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
import { beforeEach, describe, expect, it, jest } from "@jest/globals";
|
|
||||||
|
|
||||||
// Will be mutated per test before (re-)importing the module under test
|
|
||||||
let mockInputs: Record<string, string> = {};
|
|
||||||
|
|
||||||
describe("resolutionStrategy", () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
jest.resetModules();
|
|
||||||
mockInputs = {};
|
|
||||||
});
|
|
||||||
|
|
||||||
it("returns 'highest' when input not provided", async () => {
|
|
||||||
const { resolutionStrategy } = await import("../../src/utils/inputs");
|
|
||||||
expect(resolutionStrategy).toBe("highest");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("returns 'highest' when input is 'highest'", async () => {
|
|
||||||
mockInputs["resolution-strategy"] = "highest";
|
|
||||||
const { resolutionStrategy } = await import("../../src/utils/inputs");
|
|
||||||
expect(resolutionStrategy).toBe("highest");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("returns 'lowest' when input is 'lowest'", async () => {
|
|
||||||
mockInputs["resolution-strategy"] = "lowest";
|
|
||||||
const { resolutionStrategy } = await import("../../src/utils/inputs");
|
|
||||||
expect(resolutionStrategy).toBe("lowest");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("throws error for invalid input", async () => {
|
|
||||||
mockInputs["resolution-strategy"] = "invalid";
|
|
||||||
await expect(import("../../src/utils/inputs")).rejects.toThrow(
|
|
||||||
"Invalid resolution-strategy: invalid. Must be 'highest' or 'lowest'.",
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Loading…
Reference in a new issue