1- import { getOpts , getDefaults , Tool } from '../src/opts' ;
1+ import { getOpts , getDefaults } from '../src/opts' ;
2+ import type { OS , Revisions , Tool } from '../src/opts' ;
23import { getInput } from '@actions/core' ;
34import * as supported_versions from '../src/versions.json' ;
5+ import * as rv from '../src/release-revisions.json' ;
46
5- const def = getDefaults ( ) ;
7+ const release_revisions = rv as Revisions ;
8+ const def = ( os : OS ) => getDefaults ( os ) ;
69const latestVersions = {
710 ghc : supported_versions . ghc [ 0 ] ,
811 cabal : supported_versions . cabal [ 0 ] ,
912 stack : supported_versions . stack [ 0 ]
1013} ;
14+ const latestRevisions = ( os : OS ) => ( {
15+ ghc : release_revisions ?. [ os ] ?. ghc ?. [ 0 ] ?. to ,
16+ cabal : release_revisions ?. [ os ] ?. cabal ?. [ 0 ] ?. to ,
17+ stack : release_revisions ?. [ os ] ?. stack ?. [ 0 ] ?. to
18+ } ) ;
1119
1220const mkName = ( s : string ) : string =>
1321 `INPUT_${ s . replace ( / / g, '_' ) . toUpperCase ( ) } ` ;
1422
1523const setupEnv = ( o : Record < string , unknown > ) : void =>
1624 Object . entries ( o ) . forEach ( ( [ k , v ] ) => v && ( process . env [ mkName ( k ) ] = `${ v } ` ) ) ;
1725
18- const forAll = ( fn : ( t : Tool ) => any ) =>
26+ const forAllOS = ( fn : ( t : OS ) => any ) =>
27+ ( [ 'win32' , 'darwin' , 'linux' ] as const ) . forEach ( fn ) ;
28+
29+ const forAllTools = ( fn : ( t : Tool ) => any ) =>
1930 ( [ 'ghc' , 'cabal' , 'stack' ] as const ) . forEach ( fn ) ;
2031
2132describe ( 'haskell/actions/setup' , ( ) => {
@@ -30,11 +41,19 @@ describe('haskell/actions/setup', () => {
3041 afterEach ( ( ) => ( process . env = OLD_ENV ) ) ;
3142
3243 it ( 'Parses action.yml to get correct default versions' , ( ) => {
33- forAll ( t => expect ( def [ t ] . version ) . toBe ( latestVersions [ t ] ) ) ;
44+ forAllOS ( os =>
45+ forAllTools ( t =>
46+ expect ( def ( os ) [ t ] . version ) . toBe (
47+ latestRevisions ( os ) [ t ] ?? latestVersions [ t ]
48+ )
49+ )
50+ ) ;
3451 } ) ;
3552
3653 it ( 'Supported versions are parsed from JSON correctly' , ( ) =>
37- forAll ( t => expect ( def [ t ] . supported ) . toBe ( supported_versions [ t ] ) ) ) ;
54+ forAllOS ( os =>
55+ forAllTools ( t => expect ( def ( os ) [ t ] . supported ) . toBe ( supported_versions [ t ] ) )
56+ ) ) ;
3857
3958 it ( '[meta] Setup Env works' , ( ) => {
4059 setupEnv ( { input : 'value' } ) ;
@@ -44,58 +63,74 @@ describe('haskell/actions/setup', () => {
4463
4564 it ( 'getOpts grabs defaults correctly from environment' , ( ) => {
4665 setupEnv ( { } ) ;
47- const options = getOpts ( def ) ;
48- forAll ( t => expect ( options [ t ] . raw ) . toBe ( def [ t ] . version ) ) ;
66+ forAllOS ( os => {
67+ const options = getOpts ( def ( os ) , os ) ;
68+ forAllTools ( t => expect ( options [ t ] . raw ) . toBe ( def ( os ) [ t ] . version ) ) ;
69+ } ) ;
4970 } ) ;
5071
5172 it ( 'Versions resolve correctly' , ( ) => {
5273 const v = { ghc : '8.6.5' , cabal : '2.4.1.0' , stack : '2.1.3' } ;
5374 setupEnv ( {
75+ 'enable-stack' : 'true' ,
5476 'stack-version' : '2.1' ,
5577 'ghc-version' : '8.6' ,
5678 'cabal-version' : '2.4'
5779 } ) ;
58- const options = getOpts ( def ) ;
59- forAll ( t => expect ( options [ t ] . resolved ) . toBe ( v [ t ] ) ) ;
80+ forAllOS ( os => {
81+ const options = getOpts ( def ( os ) , os ) ;
82+ forAllTools ( t => expect ( options [ t ] . resolved ) . toBe ( v [ t ] ) ) ;
83+ } ) ;
6084 } ) ;
6185
6286 it ( '"latest" Versions resolve correctly' , ( ) => {
6387 setupEnv ( {
88+ 'enable-stack' : 'true' ,
6489 'stack-version' : 'latest' ,
6590 'ghc-version' : 'latest' ,
6691 'cabal-version' : 'latest'
6792 } ) ;
68- const options = getOpts ( def ) ;
69- forAll ( t => expect ( options [ t ] . resolved ) . toBe ( latestVersions [ t ] ) ) ;
93+ forAllOS ( os => {
94+ const options = getOpts ( def ( os ) , os ) ;
95+ forAllTools ( t =>
96+ expect ( options [ t ] . resolved ) . toBe (
97+ latestRevisions ( os ) [ t ] ?? latestVersions [ t ]
98+ )
99+ ) ;
100+ } ) ;
70101 } ) ;
71102
72103 it ( 'Enabling stack does not disable GHC or Cabal' , ( ) => {
73104 setupEnv ( { 'enable-stack' : 'true' } ) ;
74- const { ghc, cabal, stack} = getOpts ( def ) ;
75- expect ( {
76- ghc : ghc . enable ,
77- stack : stack . enable ,
78- cabal : cabal . enable
79- } ) . toStrictEqual ( { ghc : true , cabal : true , stack : true } ) ;
105+ forAllOS ( os => {
106+ const { ghc, cabal, stack} = getOpts ( def ( os ) , os ) ;
107+ expect ( {
108+ ghc : ghc . enable ,
109+ stack : stack . enable ,
110+ cabal : cabal . enable
111+ } ) . toStrictEqual ( { ghc : true , cabal : true , stack : true } ) ;
112+ } ) ;
80113 } ) ;
81114
82115 it ( 'Enabling stack-no-global disables GHC and Cabal' , ( ) => {
83116 setupEnv ( { 'enable-stack' : 'true' , 'stack-no-global' : 'true' } ) ;
84- const { ghc, cabal, stack} = getOpts ( def ) ;
85- expect ( {
86- ghc : ghc . enable ,
87- cabal : cabal . enable ,
88- stack : stack . enable
89- } ) . toStrictEqual ( { ghc : false , cabal : false , stack : true } ) ;
117+ forAllOS ( os => {
118+ const { ghc, cabal, stack} = getOpts ( def ( os ) , os ) ;
119+ expect ( {
120+ ghc : ghc . enable ,
121+ cabal : cabal . enable ,
122+ stack : stack . enable
123+ } ) . toStrictEqual ( { ghc : false , cabal : false , stack : true } ) ;
124+ } ) ;
90125 } ) ;
91126
92127 it ( 'Enabling stack-no-global without setting enable-stack errors' , ( ) => {
93128 setupEnv ( { 'stack-no-global' : 'true' } ) ;
94- expect ( ( ) => getOpts ( def ) ) . toThrow ( ) ;
129+ forAllOS ( os => expect ( ( ) => getOpts ( def ( os ) , os ) ) . toThrow ( ) ) ;
95130 } ) ;
96131
97132 it ( 'Enabling stack-setup-ghc without setting enable-stack errors' , ( ) => {
98133 setupEnv ( { 'stack-setup-ghc' : 'true' } ) ;
99- expect ( ( ) => getOpts ( def ) ) . toThrow ( ) ;
134+ forAllOS ( os => expect ( ( ) => getOpts ( def ( os ) , os ) ) . toThrow ( ) ) ;
100135 } ) ;
101136} ) ;
0 commit comments