Skip to content

Commit c51017c

Browse files
author
Tom Sydney Kerckhove
committed
Refactor nix-based tests out so they don't pollute the overlay
1 parent 40c1668 commit c51017c

File tree

4 files changed

+147
-140
lines changed

4 files changed

+147
-140
lines changed

.github/workflows/build.yml

+5-5
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ jobs:
1919
- .#devShells.x86_64-linux.default
2020
- .#packages.x86_64-linux.default
2121
- .#checks.x86_64-linux.pre-commit
22-
- .#checks.x86_64-linux.test-golden
23-
- .#checks.x86_64-linux.test-golden-generate
24-
- .#checks.x86_64-linux.test-system-1
25-
- .#checks.x86_64-linux.test-system-2
26-
- .#checks.x86_64-linux.test-system-3
22+
- .#checks.x86_64-linux.testGolden
23+
- .#checks.x86_64-linux.testGoldenGenerate
24+
- .#checks.x86_64-linux.testSystem1
25+
- .#checks.x86_64-linux.testSystem2
26+
- .#checks.x86_64-linux.testSystem3
2727
steps:
2828
- uses: actions/[email protected]
2929
- uses: cachix/install-nix-action@v18

flake.nix

+42-38
Original file line numberDiff line numberDiff line change
@@ -44,48 +44,52 @@
4444
overlays = import ./nix/overlay.nix;
4545
packages.release = pkgs.openapi3-code-generator;
4646
packages.default = self.packages.${system}.release;
47-
checks = {
48-
test-system-1 = pkgs.testSystem1;
49-
test-system-2 = pkgs.testSystem2;
50-
test-system-3 = pkgs.testSystem3;
51-
test-golden = pkgs.testGolden;
52-
test-golden-generate = pkgs.testGoldenGenerate;
53-
pre-commit = pre-commit-hooks.lib.${system}.run {
54-
src = ./.;
55-
hooks = {
56-
nixpkgs-fmt = {
57-
enable = true;
58-
excludes = [
59-
"example"
60-
"testing/golden-output"
61-
".*/default.nix"
62-
];
63-
};
64-
hlint = {
65-
enable = true;
66-
excludes = [
67-
"example"
68-
"testing/golden-output"
69-
];
70-
};
71-
ormolu = {
72-
enable = true;
73-
excludes = [
74-
"example"
75-
"testing/golden-output"
76-
];
77-
};
47+
checks =
48+
let tests = import ./nix/tests.nix { inherit pkgs; };
49+
in
50+
{
51+
inherit (tests)
52+
testSystem1
53+
testSystem2
54+
testSystem3
55+
testGolden
56+
testGoldenGenerate;
57+
pre-commit = pre-commit-hooks.lib.${system}.run {
58+
src = ./.;
59+
hooks = {
60+
nixpkgs-fmt = {
61+
enable = true;
62+
excludes = [
63+
"example"
64+
"testing/golden-output"
65+
".*/default.nix"
66+
];
67+
};
68+
hlint = {
69+
enable = true;
70+
excludes = [
71+
"example"
72+
"testing/golden-output"
73+
];
74+
};
75+
ormolu = {
76+
enable = true;
77+
excludes = [
78+
"example"
79+
"testing/golden-output"
80+
];
81+
};
7882

79-
cabal2nix = {
80-
enable = true;
81-
excludes = [
82-
"example"
83-
"testing/golden-output"
84-
];
83+
cabal2nix = {
84+
enable = true;
85+
excludes = [
86+
"example"
87+
"testing/golden-output"
88+
];
89+
};
8590
};
8691
};
8792
};
88-
};
8993
devShells.default = pkgs.haskellPackages.shellFor {
9094
name = "openapi-code-generator-shell";
9195
packages = (p:

nix/overlay.nix

+2-97
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,9 @@
11
final: prev:
22
with final.lib;
33
with final.haskell.lib;
4-
let
4+
{
55
generateOpenAPIClient = import ./generate-client.nix { pkgs = final; };
6-
generateCode = { fileName, extraFlags ? [ ] }:
7-
let
8-
name = builtins.replaceStrings [ "_" ] [ "-" ] (strings.removeSuffix ".yaml" (strings.removeSuffix ".json" (strings.removeSuffix ".yml" fileName)));
9-
in
10-
{
11-
name = name;
12-
path = (generateOpenAPIClient {
13-
name = "openapi";
14-
src = ../specifications + "/${fileName}";
15-
extraFlags = extraFlags;
16-
}).code;
17-
};
18-
goldenTestCode = generateCode { fileName = "z_complex_self_made_example.yml"; };
19-
codeForSpecsLevelOne = [
20-
(generateCode { fileName = "google-payment.json"; })
21-
(generateCode { fileName = "hetzner.json"; })
22-
(generateCode { fileName = "official-api-with-examples.yaml"; })
23-
(generateCode { fileName = "official-callback-example.yaml"; })
24-
(generateCode { fileName = "official-link-example.yaml"; })
25-
(generateCode { fileName = "official-petstore-expanded.yaml"; })
26-
(generateCode { fileName = "official-uspto.yaml"; })
27-
(generateCode { fileName = "petstore-expanded.json"; })
28-
(generateCode { fileName = "selenium.yaml"; extraFlags = [ "--response-type-suffix=\"Response'\"" ]; })
29-
(generateCode { fileName = "spot_api.yml"; extraFlags = [ "--opaque-schema=\"aggTrade\"" ]; })
30-
(generateCode { fileName = "uber.json"; })
31-
(generateCode { fileName = "z_complex_self_made_example.yml"; })
32-
];
33-
codeForSpecsLevelTwo = [
34-
(generateCode { fileName = "official-petstore.yaml"; })
35-
(generateCode { fileName = "petstore-running-example.yaml"; })
36-
(generateCode { fileName = "stripe-api.yml"; extraFlags = [ "--property-type-suffix=\"'\"" "--convert-to-camel-case" ]; })
37-
];
38-
codeForSpecsLevelThree = [
39-
(generateCode { fileName = "petstore-running-example.yaml"; })
40-
];
6+
openapi3-code-generator = justStaticExecutables final.haskellPackages.openapi3-code-generator;
417
haskellPackages =
428
prev.haskellPackages.override (
439
old:
@@ -59,65 +25,4 @@ let
5925
);
6026
}
6127
);
62-
in
63-
{
64-
generateOpenAPIClient = import ./generate-client.nix { pkgs = final; };
65-
openapi3-code-generator = justStaticExecutables final.haskellPackages.openapi3-code-generator;
66-
haskellPackages = haskellPackages;
67-
mockServer = disableOptimization (disableLibraryProfiling (haskellPackages.callCabal2nix "level-3-mock-server" (../testing/level3/mock-server) { }));
68-
testSystem1 = final.symlinkJoin {
69-
name = "test-system-1";
70-
paths = (builtins.map
71-
(pkg:
72-
disableOptimization (disableLibraryProfiling (haskellPackages.callCabal2nix "${pkg.name}-compiled" pkg.path { }))
73-
)
74-
codeForSpecsLevelOne);
75-
};
76-
testSystem2 = final.symlinkJoin {
77-
name = "test-system-2";
78-
paths = (builtins.map
79-
(pkg:
80-
let
81-
openapi = disableOptimization (disableLibraryProfiling (haskellPackages.callCabal2nix "${pkg.name}-compiled" pkg.path { }));
82-
base = disableOptimization (disableLibraryProfiling (haskellPackages.callCabal2nix "level2-base" ../testing/level2/level2-base { openapi = openapi; }));
83-
in
84-
disableOptimization (disableLibraryProfiling (haskellPackages.callCabal2nix "${pkg.name}-tests" (../testing/level2 + "/${pkg.name}") { level2-base = base; openapi = openapi; }))
85-
)
86-
codeForSpecsLevelTwo);
87-
};
88-
testSystem3 = final.symlinkJoin {
89-
name = "test-system-3";
90-
paths = (builtins.map
91-
(pkg:
92-
let
93-
openapi = disableOptimization (disableLibraryProfiling (haskellPackages.callCabal2nix "${pkg.name}-compiled" pkg.path { }));
94-
in
95-
overrideCabal (disableOptimization (disableLibraryProfiling (haskellPackages.callCabal2nix "${pkg.name}-tests" (../testing/level3 + "/${pkg.name}") { openapi = openapi; }))) (old: {
96-
preCheck = (old.preCheck or "") + ''
97-
${final.killall}/bin/killall -r mock-server-exe || true
98-
${final.mockServer}/bin/mock-server-exe &
99-
'';
100-
postCheck = (old.postCheck or "") + ''
101-
${final.killall}/bin/killall -r mock-server-exe
102-
'';
103-
})
104-
)
105-
codeForSpecsLevelThree);
106-
};
107-
testGolden = final.stdenv.mkDerivation {
108-
name = "test-golden";
109-
src = ../testing/golden-output;
110-
111-
buildCommand = ''
112-
diff -r ${goldenTestCode.path} $src
113-
mkdir -p $out
114-
echo "Golden test success" > $out/success
115-
'';
116-
};
117-
testGoldenGenerate = final.stdenv.mkDerivation {
118-
name = "test-golden-generate";
119-
buildCommand = ''
120-
cp -R ${goldenTestCode.path} $out
121-
'';
122-
};
12328
}

nix/tests.nix

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
{ pkgs }:
2+
with pkgs.lib;
3+
with pkgs.haskell.lib;
4+
let
5+
generateCode = { fileName, extraFlags ? [ ] }:
6+
let
7+
name = builtins.replaceStrings [ "_" ] [ "-" ] (strings.removeSuffix ".yaml" (strings.removeSuffix ".json" (strings.removeSuffix ".yml" fileName)));
8+
in
9+
{
10+
name = name;
11+
path = (pkgs.generateOpenAPIClient {
12+
name = "openapi";
13+
src = ../specifications + "/${fileName}";
14+
extraFlags = extraFlags;
15+
}).code;
16+
};
17+
goldenTestCode = generateCode { fileName = "z_complex_self_made_example.yml"; };
18+
codeForSpecsLevelOne = [
19+
(generateCode { fileName = "google-payment.json"; })
20+
(generateCode { fileName = "hetzner.json"; })
21+
(generateCode { fileName = "official-api-with-examples.yaml"; })
22+
(generateCode { fileName = "official-callback-example.yaml"; })
23+
(generateCode { fileName = "official-link-example.yaml"; })
24+
(generateCode { fileName = "official-petstore-expanded.yaml"; })
25+
(generateCode { fileName = "official-uspto.yaml"; })
26+
(generateCode { fileName = "petstore-expanded.json"; })
27+
(generateCode { fileName = "selenium.yaml"; extraFlags = [ "--response-type-suffix=\"Response'\"" ]; })
28+
(generateCode { fileName = "spot_api.yml"; extraFlags = [ "--opaque-schema=\"aggTrade\"" ]; })
29+
(generateCode { fileName = "uber.json"; })
30+
(generateCode { fileName = "z_complex_self_made_example.yml"; })
31+
];
32+
codeForSpecsLevelTwo = [
33+
(generateCode { fileName = "official-petstore.yaml"; })
34+
(generateCode { fileName = "petstore-running-example.yaml"; })
35+
(generateCode { fileName = "stripe-api.yml"; extraFlags = [ "--property-type-suffix=\"'\"" "--convert-to-camel-case" ]; })
36+
];
37+
codeForSpecsLevelThree = [
38+
(generateCode { fileName = "petstore-running-example.yaml"; })
39+
];
40+
mockServer = disableOptimization (disableLibraryProfiling (pkgs.haskellPackages.callCabal2nix "level-3-mock-server" (../testing/level3/mock-server) { }));
41+
in
42+
{
43+
testSystem1 = pkgs.symlinkJoin {
44+
name = "test-system-1";
45+
paths = (builtins.map
46+
(pkg:
47+
disableOptimization (disableLibraryProfiling (pkgs.haskellPackages.callCabal2nix "${pkg.name}-compiled" pkg.path { }))
48+
)
49+
codeForSpecsLevelOne);
50+
};
51+
testSystem2 = pkgs.symlinkJoin {
52+
name = "test-system-2";
53+
paths = (builtins.map
54+
(pkg:
55+
let
56+
openapi = disableOptimization (disableLibraryProfiling (pkgs.haskellPackages.callCabal2nix "${pkg.name}-compiled" pkg.path { }));
57+
base = disableOptimization (disableLibraryProfiling (pkgs.haskellPackages.callCabal2nix "level2-base" ../testing/level2/level2-base { openapi = openapi; }));
58+
in
59+
disableOptimization (disableLibraryProfiling (pkgs.haskellPackages.callCabal2nix "${pkg.name}-tests" (../testing/level2 + "/${pkg.name}") { level2-base = base; openapi = openapi; }))
60+
)
61+
codeForSpecsLevelTwo);
62+
};
63+
testSystem3 = pkgs.symlinkJoin {
64+
name = "test-system-3";
65+
paths = (builtins.map
66+
(pkg:
67+
let
68+
openapi = disableOptimization (disableLibraryProfiling (pkgs.haskellPackages.callCabal2nix "${pkg.name}-compiled" pkg.path { }));
69+
in
70+
overrideCabal (disableOptimization (disableLibraryProfiling (pkgs.haskellPackages.callCabal2nix "${pkg.name}-tests" (../testing/level3 + "/${pkg.name}") { openapi = openapi; }))) (old: {
71+
preCheck = (old.preCheck or "") + ''
72+
${pkgs.killall}/bin/killall -r mock-server-exe || true
73+
${mockServer}/bin/mock-server-exe &
74+
'';
75+
postCheck = (old.postCheck or "") + ''
76+
${pkgs.killall}/bin/killall -r mock-server-exe
77+
'';
78+
})
79+
)
80+
codeForSpecsLevelThree);
81+
};
82+
testGolden = pkgs.stdenv.mkDerivation {
83+
name = "test-golden";
84+
src = ../testing/golden-output;
85+
86+
buildCommand = ''
87+
diff -r ${goldenTestCode.path} $src
88+
mkdir -p $out
89+
echo "Golden test success" > $out/success
90+
'';
91+
};
92+
testGoldenGenerate = pkgs.stdenv.mkDerivation {
93+
name = "test-golden-generate";
94+
buildCommand = ''
95+
cp -R ${goldenTestCode.path} $out
96+
'';
97+
};
98+
}

0 commit comments

Comments
 (0)