@@ -20,64 +20,121 @@ beforeEach(async () => {
2020 <div id="download-alert" class="d-none"></div>
2121 ` ;
2222
23+ const realWorkflow = await import ( "../public/scripts/workflow.js" ) ;
24+ jest . unstable_mockModule ( "../public/scripts/workflow.js" , ( ) => ( {
25+ ...realWorkflow ,
26+ detectDefaultBranch : jest . fn ( ) . mockResolvedValue ( "main" ) ,
27+ } ) ) ;
28+
2329 await import ( "../public/scripts/main.js" ) ;
2430 window . navigateTo = jest . fn ( ) ;
2531} ) ;
2632
27- test ( "form submit with invalid repo shows error" , ( ) => {
33+ const flushPromises = ( ) => new Promise ( ( r ) => setTimeout ( r , 0 ) ) ;
34+
35+ test ( "form submit with invalid repo shows error" , async ( ) => {
2836 const repoInput = document . getElementById ( "repo" ) ;
2937 expect ( repoInput . classList . contains ( "is-invalid" ) ) . toBe ( false ) ;
3038 repoInput . value = "invalidrepo" ;
3139 document
3240 . getElementById ( "generate-form" )
3341 . dispatchEvent ( new Event ( "submit" , { bubbles : true , cancelable : true } ) ) ;
42+ await flushPromises ( ) ;
3443 expect ( repoInput . classList . contains ( "is-invalid" ) ) . toBe ( true ) ;
3544 expect ( window . navigateTo ) . not . toHaveBeenCalled ( ) ;
3645} ) ;
3746
38- test ( "form submit with valid slug works" , ( ) => {
47+ test ( "form submit with valid slug works" , async ( ) => {
3948 const repoInput = document . getElementById ( "repo" ) ;
4049 repoInput . value = "owner/repo" ;
4150 document
4251 . getElementById ( "generate-form" )
4352 . dispatchEvent ( new Event ( "submit" , { bubbles : true , cancelable : true } ) ) ;
53+ await flushPromises ( ) ;
4454 expect ( window . navigateTo ) . toHaveBeenCalledWith (
4555 expect . stringContaining ( "https://github.com/owner/repo/new/main?filename=" ) ,
4656 ) ;
4757} ) ;
4858
49- test ( "form submit with valid URL works" , ( ) => {
59+ test ( "form submit with valid URL works" , async ( ) => {
5060 const repoInput = document . getElementById ( "repo" ) ;
5161 repoInput . value = "https://github.com/octocat/Hello-World" ;
5262 document
5363 . getElementById ( "generate-form" )
5464 . dispatchEvent ( new Event ( "submit" , { bubbles : true , cancelable : true } ) ) ;
65+ await flushPromises ( ) ;
5566 expect ( window . navigateTo ) . toHaveBeenCalledWith (
5667 expect . stringContaining (
5768 "https://github.com/octocat/Hello-World/new/main?filename=" ,
5869 ) ,
5970 ) ;
6071} ) ;
6172
62- test ( "form submit with valid cloud-hosted enterprise URL works" , ( ) => {
73+ test ( "form submit with valid cloud-hosted enterprise URL works" , async ( ) => {
6374 const repoInput = document . getElementById ( "repo" ) ;
6475 repoInput . value = "https://github.com/enterprises/gh/octocat/Hello-World" ;
6576 document
6677 . getElementById ( "generate-form" )
6778 . dispatchEvent ( new Event ( "submit" , { bubbles : true , cancelable : true } ) ) ;
79+ await flushPromises ( ) ;
6880 expect ( window . navigateTo ) . toHaveBeenCalledWith (
6981 expect . stringContaining (
7082 "https://github.com/enterprises/gh/octocat/Hello-World/new/main?filename=" ,
7183 ) ,
7284 ) ;
7385} ) ;
7486
87+ test ( "form submit uses detected default branch" , async ( ) => {
88+ jest . resetModules ( ) ;
89+ jest . unstable_mockModule ( "../public/scripts/workflow.js" , ( ) => ( {
90+ parseRepositoryURL : ( v ) => ( {
91+ origin : "https://github.com" ,
92+ owner : "o" ,
93+ repo : "r" ,
94+ } ) ,
95+ detectDefaultBranch : jest . fn ( ) . mockResolvedValue ( "master" ) ,
96+ generateWorkflow : ( ) => "yaml-content" ,
97+ } ) ) ;
98+ await import ( "../public/scripts/main.js" ) ;
99+ window . navigateTo = jest . fn ( ) ;
100+ document
101+ . getElementById ( "generate-form" )
102+ . dispatchEvent ( new Event ( "submit" , { bubbles : true , cancelable : true } ) ) ;
103+ await flushPromises ( ) ;
104+ expect ( window . navigateTo ) . toHaveBeenCalledWith (
105+ expect . stringContaining ( "https://github.com/o/r/new/master?filename=" ) ,
106+ ) ;
107+ } ) ;
108+
109+ test ( "form submit defaults to main branch if detection fails" , async ( ) => {
110+ jest . resetModules ( ) ;
111+ jest . unstable_mockModule ( "../public/scripts/workflow.js" , ( ) => ( {
112+ parseRepositoryURL : ( v ) => ( {
113+ origin : "https://github.com" ,
114+ owner : "o" ,
115+ repo : "r" ,
116+ } ) ,
117+ detectDefaultBranch : jest . fn ( ) . mockResolvedValue ( null ) ,
118+ generateWorkflow : ( ) => "yaml-content" ,
119+ } ) ) ;
120+ await import ( "../public/scripts/main.js" ) ;
121+ window . navigateTo = jest . fn ( ) ;
122+ document
123+ . getElementById ( "generate-form" )
124+ . dispatchEvent ( new Event ( "submit" , { bubbles : true , cancelable : true } ) ) ;
125+ await flushPromises ( ) ;
126+ expect ( window . navigateTo ) . toHaveBeenCalledWith (
127+ expect . stringContaining ( "https://github.com/o/r/new/main?filename=" ) ,
128+ ) ;
129+ } ) ;
130+
75131test ( "advanced options are passed to generateWorkflow" , async ( ) => {
76132 // Re-import main.js with a spy on generateWorkflow
77133 jest . resetModules ( ) ;
78134 const workflowSpy = jest . fn ( ( ) => "yaml-content" ) ;
79135 jest . unstable_mockModule ( "../public/scripts/workflow.js" , ( ) => ( {
80136 parseRepositoryURL : ( v ) => ( { owner : "o" , repo : "r" } ) ,
137+ detectDefaultBranch : jest . fn ( ) . mockResolvedValue ( "main" ) ,
81138 generateWorkflow : workflowSpy ,
82139 } ) ) ;
83140 document . getElementById ( "repo" ) . value = "o/r" ;
@@ -89,15 +146,17 @@ test("advanced options are passed to generateWorkflow", async () => {
89146 document
90147 . getElementById ( "generate-form" )
91148 . dispatchEvent ( new Event ( "submit" , { bubbles : true , cancelable : true } ) ) ;
149+ await flushPromises ( ) ;
92150 expect ( workflowSpy ) . toHaveBeenCalledWith ( {
93151 useBatchToken : true ,
94152 useVirtualDisplay : false ,
95153 buildAcrossPlatforms : true ,
96154 siteUrl : "http://localhost" ,
155+ branch : "main" ,
97156 } ) ;
98157} ) ;
99158
100- test ( "download link triggers file download" , ( ) => {
159+ test ( "download link triggers file download" , async ( ) => {
101160 const repoInput = document . getElementById ( "repo" ) ;
102161 repoInput . value = "owner/repo" ;
103162
@@ -116,6 +175,8 @@ test("download link triggers file download", () => {
116175
117176 document . getElementById ( "download-alert-link" ) . click ( ) ;
118177
178+ await flushPromises ( ) ;
179+
119180 expect ( mockCreateObjectURL ) . toHaveBeenCalled ( ) ;
120181 expect ( clickSpy ) . toHaveBeenCalled ( ) ;
121182 expect ( mockRevokeObjectURL ) . toHaveBeenCalled ( ) ;
0 commit comments