@@ -4,21 +4,27 @@ import any from '@travi/any';
4
4
import { it , describe , vi , expect , beforeEach } from 'vitest' ;
5
5
import { when } from 'jest-when' ;
6
6
7
+ import { determineAppropriateWorkflow } from '../reusable-release-workflow.js' ;
7
8
import scaffoldWorkflow from './scaffolder.js' ;
8
9
import lift from './lifter.js' ;
9
10
10
11
vi . mock ( '@form8ion/github-workflows-core' ) ;
12
+ vi . mock ( '../reusable-release-workflow.js' ) ;
11
13
vi . mock ( './scaffolder.js' ) ;
12
14
13
15
const experimentalReleaseWorkflowName = 'experimental-release' ;
14
16
15
17
describe ( 'experimental release workflow lifter' , ( ) => {
16
18
const projectRoot = any . string ( ) ;
17
19
const nodeVersion = any . string ( ) ;
20
+ const appropriateReusableReleaseWorkflowVersion = any . string ( ) ;
18
21
const scaffoldResults = any . simpleObject ( ) ;
19
22
20
23
beforeEach ( ( ) => {
21
24
when ( scaffoldWorkflow ) . calledWith ( { projectRoot, nodeVersion} ) . mockResolvedValue ( scaffoldResults ) ;
25
+ when ( determineAppropriateWorkflow )
26
+ . calledWith ( nodeVersion )
27
+ . mockReturnValue ( appropriateReusableReleaseWorkflowVersion ) ;
22
28
} ) ;
23
29
24
30
it ( 'should call the scaffolder when the experimental release workflow does not exist' , async ( ) => {
@@ -32,15 +38,22 @@ describe('experimental release workflow lifter', () => {
32
38
when ( workflowFileExists ) . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } ) . mockResolvedValue ( true ) ;
33
39
when ( loadWorkflowFile )
34
40
. calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } )
35
- . mockResolvedValue ( { on : { workflow_dispatch : { } } , permissions : { contents : 'read' } } ) ;
41
+ . mockResolvedValue ( {
42
+ on : { workflow_dispatch : { } } ,
43
+ permissions : { contents : 'read' } ,
44
+ jobs : { release : { uses : appropriateReusableReleaseWorkflowVersion } }
45
+ } ) ;
36
46
37
47
expect ( await lift ( { projectRoot, nodeVersion} ) ) . toEqual ( scaffoldResults ) ;
38
48
expect ( renameWorkflowFile ) . not . toHaveBeenCalled ( ) ;
39
49
} ) ;
40
50
41
51
it ( 'should re-run the scaffolder when permissions have not been restricted' , async ( ) => {
42
52
when ( workflowFileExists ) . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } ) . mockResolvedValue ( true ) ;
43
- when ( loadWorkflowFile ) . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } ) . mockResolvedValue ( { on : { } } ) ;
53
+ when ( loadWorkflowFile ) . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } ) . mockResolvedValue ( {
54
+ on : { } ,
55
+ jobs : { release : { uses : appropriateReusableReleaseWorkflowVersion } }
56
+ } ) ;
44
57
45
58
expect ( await lift ( { projectRoot, nodeVersion} ) ) . toEqual ( scaffoldResults ) ;
46
59
expect ( renameWorkflowFile ) . not . toHaveBeenCalled ( ) ;
@@ -50,7 +63,11 @@ describe('experimental release workflow lifter', () => {
50
63
when ( workflowFileExists ) . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } ) . mockResolvedValue ( true ) ;
51
64
when ( loadWorkflowFile )
52
65
. calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } )
53
- . mockResolvedValue ( { on : { } , permissions : any . simpleObject ( ) } ) ;
66
+ . mockResolvedValue ( {
67
+ on : { } ,
68
+ permissions : any . simpleObject ( ) ,
69
+ jobs : { release : { uses : appropriateReusableReleaseWorkflowVersion } }
70
+ } ) ;
54
71
55
72
expect ( await lift ( { projectRoot, nodeVersion} ) ) . toEqual ( scaffoldResults ) ;
56
73
expect ( renameWorkflowFile ) . not . toHaveBeenCalled ( ) ;
@@ -60,7 +77,11 @@ describe('experimental release workflow lifter', () => {
60
77
when ( workflowFileExists ) . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } ) . mockResolvedValue ( true ) ;
61
78
when ( loadWorkflowFile )
62
79
. calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } )
63
- . mockResolvedValue ( { on : { } , permissions : { contents : 'write' } } ) ;
80
+ . mockResolvedValue ( {
81
+ on : { } ,
82
+ permissions : { contents : 'write' } ,
83
+ jobs : { release : { uses : appropriateReusableReleaseWorkflowVersion } }
84
+ } ) ;
64
85
65
86
expect ( await lift ( { projectRoot, nodeVersion} ) ) . toEqual ( scaffoldResults ) ;
66
87
expect ( renameWorkflowFile ) . not . toHaveBeenCalled ( ) ;
@@ -70,18 +91,45 @@ describe('experimental release workflow lifter', () => {
70
91
when ( workflowFileExists ) . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } ) . mockResolvedValue ( true ) ;
71
92
when ( loadWorkflowFile )
72
93
. calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } )
73
- . mockResolvedValue ( { on : { } , permissions : { contents : 'read' } } ) ;
94
+ . mockResolvedValue ( {
95
+ on : { } ,
96
+ permissions : { contents : 'read' } ,
97
+ jobs : { release : { uses : appropriateReusableReleaseWorkflowVersion } }
98
+ } ) ;
74
99
75
100
expect ( await lift ( { projectRoot, nodeVersion} ) ) . toBe ( undefined ) ;
76
101
expect ( renameWorkflowFile ) . not . toHaveBeenCalled ( ) ;
77
102
} ) ;
78
103
104
+ it ( 'should re-run the scaffolder when an inappropriate version of the reusable workflow is referenced' , async ( ) => {
105
+ const inappropriateReusableReleaseWorkflowVersion = any . string ( ) ;
106
+ when ( workflowFileExists ) . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } ) . mockResolvedValue ( true ) ;
107
+ when ( loadWorkflowFile )
108
+ . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } )
109
+ . mockResolvedValue ( {
110
+ on : { } ,
111
+ permissions : { contents : 'read' } ,
112
+ jobs : { release : { uses : inappropriateReusableReleaseWorkflowVersion } }
113
+ } ) ;
114
+
115
+ expect ( await lift ( { projectRoot, nodeVersion} ) ) . toEqual ( scaffoldResults ) ;
116
+ expect ( renameWorkflowFile ) . not . toHaveBeenCalled ( ) ;
117
+ } ) ;
118
+
79
119
it ( 'should should rename a legacy release workflow to clarify that it is for experimental releases' , async ( ) => {
80
120
const legacyReleaseWorkflowName = 'release' ;
81
121
when ( workflowFileExists ) . calledWith ( { projectRoot, name : legacyReleaseWorkflowName } ) . mockResolvedValue ( true ) ;
82
122
when ( loadWorkflowFile )
83
123
. calledWith ( { projectRoot, name : legacyReleaseWorkflowName } )
84
- . mockResolvedValue ( { on : { } , permissions : { contents : 'read' } } ) ;
124
+ . mockResolvedValue ( any . simpleObject ( ) ) ;
125
+ when ( workflowFileExists ) . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } ) . mockResolvedValue ( true ) ;
126
+ when ( loadWorkflowFile )
127
+ . calledWith ( { projectRoot, name : experimentalReleaseWorkflowName } )
128
+ . mockResolvedValue ( {
129
+ on : { } ,
130
+ permissions : { contents : 'read' } ,
131
+ jobs : { release : { uses : appropriateReusableReleaseWorkflowVersion } }
132
+ } ) ;
85
133
86
134
expect ( await lift ( { projectRoot, nodeVersion} ) ) . toBe ( undefined ) ;
87
135
expect ( renameWorkflowFile ) . toHaveBeenCalledWith ( {
0 commit comments