33import com .microsoft .playwright .Browser ;
44import com .microsoft .playwright .BrowserContext ;
55import com .microsoft .playwright .BrowserType ;
6- import com .microsoft .playwright .Download ;
76import com .microsoft .playwright .ElementHandle ;
8- import com .microsoft .playwright .Mouse ;
97import com .microsoft .playwright .Page ;
108import com .microsoft .playwright .Playwright ;
11- import com .microsoft .playwright .Playwright . CreateOptions ;
9+ import com .microsoft .playwright .Response ;
1210import io .quarkus .runtime .QuarkusApplication ;
1311import io .quarkus .runtime .annotations .QuarkusMain ;
1412import io .smallrye .config .ConfigMapping ;
1513import io .smallrye .config .WithName ;
16- import org .slf4j .Logger ;
17- import org .slf4j .LoggerFactory ;
14+ import org .jboss .logging .Logger ;
1815
1916import java .io .IOException ;
2017import java .nio .file .Files ;
2118import java .nio .file .Path ;
2219import java .util .List ;
23- import java .util .Locale ;
24- import java .util .Map ;
2520import java .util .Optional ;
26- import java .util .concurrent .CountDownLatch ;
2721
2822@ QuarkusMain
2923public class AcceptanceTestApp implements QuarkusApplication {
3024
3125 public static final String DEFAULT_URL = "https://stage.code.quarkus.io" ;
3226
33- private static final Logger LOG = LoggerFactory .getLogger (AcceptanceTestApp .class );
27+ private static final Logger LOG = Logger .getLogger (AcceptanceTestApp .class );
3428
3529 private static final String GENERATE_YOUR_APPLICATION_TEXT = "generate your application" ;
3630 public static final String LABEL_TOGGLE_FULL_LIST = "[aria-label='Toggle full list of extensions']" ;
@@ -54,73 +48,101 @@ public int run(String... args) throws Exception {
5448 // Open new page
5549 Page page = context .newPage ();
5650 final String url = testConfig .getUrl ().orElse (DEFAULT_URL );
57- LOG .info ("Navigating to {}" , url );
58- page .navigate (url );
59- final ElementHandle generateButton = page .waitForSelector (".generate-button" );
60- if (!generateButton .textContent ().toLowerCase ().contains (GENERATE_YOUR_APPLICATION_TEXT )) {
61- LOG .error ("{} was not found" , GENERATE_YOUR_APPLICATION_TEXT );
62- return 1 ;
51+ if (url .contains ("," )) {
52+ var urls = url .split ("," );
53+ for (String u : urls ) {
54+ final int x = testUrl (u .trim (), page );
55+ if (x != 0 )
56+ return x ;
57+ }
6358 } else {
64- LOG .info ("Generate button found: {}" , generateButton .textContent ());
59+ final int x = testUrl (url .trim (), page );
60+ if (x != 0 )
61+ return x ;
6562 }
6663
67- final ElementHandle startCodingBlurbButton = page .waitForSelector (".quarkus-blurb .btn-secondary" );
68- LOG .info ("Click on start coding" );
69- startCodingBlurbButton .click ();
64+ LOG .info ("ACCEPTANCE TEST PASSED" );
65+ }
66+ return 0 ;
67+ }
7068
71- final ElementHandle streamPicker = page .waitForSelector (".stream-picker" );
72- LOG .info ("Click on stream-picker" );
73- streamPicker .click ();
69+ private int testUrl (String url , Page page ) {
70+ LOG .infof ("Navigating to %s" , url );
71+ page .navigate (url );
72+ final ElementHandle generateButton = page .waitForSelector (".generate-button" );
73+ if (!generateButton .textContent ().toLowerCase ().contains (GENERATE_YOUR_APPLICATION_TEXT )) {
74+ LOG .errorf ("%s was not found" , GENERATE_YOUR_APPLICATION_TEXT );
75+ return 1 ;
76+ } else {
77+ LOG .infof ("Generate button found: %s" , generateButton .textContent ());
78+ }
7479
75- final List <ElementHandle > streams = page .querySelectorAll (".stream-picker .dropdown-menu .dropdown-item" );
76- final Integer minStreams = testConfig .getMinStreams ().orElse (DEFAULT_MIN_STREAMS );
80+ final ElementHandle startCodingBlurbButton = page .waitForSelector (".quarkus-blurb .btn-secondary" );
81+ LOG .info ("Click on start coding" );
82+ startCodingBlurbButton .click ();
7783
78- if (streams .size () < minStreams ) {
79- LOG .error ("{} streams found is low than minimum requirement: {}" , streams .size (), minStreams );
80- return 1 ;
81- } else {
82- LOG .info ("{} streams found" , streams .size ());
83- }
84- page .waitForSelector (LABEL_TOGGLE_FULL_LIST ).click ();
85- page .waitForSelector (".extensions-picker .extension-row" );
86- final List <ElementHandle > extensions = page .querySelectorAll (".extensions-picker .extension-row" );
87- final Integer minExtensions = testConfig .getMinExtensions ().orElse (DEFAULT_MIN_EXTENSIONS );
88-
89- if (extensions .size () < minExtensions ) {
90- LOG .error ("{} extensions found is low than minimum requirement: {}" , extensions .size (), minExtensions );
91- return 1 ;
92- } else {
93- LOG .info ("{} extensions found" , extensions .size ());
94- }
95- LOG .info ("Click on first extensions" );
96- extensions .get (0 ).click (new ElementHandle .ClickOptions ().setForce (true ));
84+ final ElementHandle streamPicker = page .waitForSelector (".stream-picker" );
85+ LOG .info ("Click on stream-picker" );
86+ streamPicker .click ();
9787
98- LOG . info ( "Click on second extensions " );
99- extensions . get ( 1 ). click ( new ElementHandle . ClickOptions (). setForce ( true ) );
88+ final List < ElementHandle > streams = page . querySelectorAll ( ".stream-picker .dropdown-menu .dropdown-item " );
89+ final Integer minStreams = testConfig . getMinStreams (). orElse ( DEFAULT_MIN_STREAMS );
10090
101- final ElementHandle extensionsCart = page .waitForSelector (".extensions-cart button" );
102- LOG .info ("Focus on extensions-cart button" );
103- page .mouse ().move (extensionsCart .boundingBox ().x + 5 , extensionsCart .boundingBox ().y + 5 );
91+ if (streams .size () < minStreams ) {
92+ LOG .errorf ("%s streams found is low than minimum requirement: %s" , streams .size (), minStreams );
93+ return 1 ;
94+ } else {
95+ LOG .infof ("%s streams found" , streams .size ());
96+ }
97+ page .waitForSelector (LABEL_TOGGLE_FULL_LIST ).click ();
98+ page .waitForSelector (".extensions-picker .extension-row" );
99+ final List <ElementHandle > extensions = page .querySelectorAll (".extensions-picker .extension-row" );
100+ final Integer minExtensions = testConfig .getMinExtensions ().orElse (DEFAULT_MIN_EXTENSIONS );
101+
102+ if (extensions .size () < minExtensions ) {
103+ LOG .errorf ("%s extensions found is low than minimum requirement: %s" , extensions .size (), minExtensions );
104+ return 1 ;
105+ } else {
106+ LOG .infof ("%s extensions found" , extensions .size ());
107+ }
108+ LOG .info ("Click on first extensions" );
109+ extensions .get (0 ).click (new ElementHandle .ClickOptions ().setForce (true ));
104110
105- final List <ElementHandle > selected = page .querySelectorAll (".selected-extensions .extension-row" );
111+ LOG .info ("Click on second extensions" );
112+ extensions .get (1 ).click (new ElementHandle .ClickOptions ().setForce (true ));
106113
107- if (selected .size () != 2 ) {
108- LOG .error ("{} extensions selected instead of 2" , selected .size ());
109- return 1 ;
110- } else {
111- LOG .info ("{} extensions selected" , selected .size ());
112- }
114+ final ElementHandle extensionsCart = page .waitForSelector (".extensions-cart button" );
115+ LOG .info ("Focus on extensions-cart button" );
116+ page .mouse ().move (extensionsCart .boundingBox ().x + 5 , extensionsCart .boundingBox ().y + 5 );
113117
114- LOG .info ("Click on generate button" );
115- generateButton .click ();
118+ final List <ElementHandle > selected = page .querySelectorAll (".selected-extensions .extension-row" );
119+
120+ if (selected .size () != 2 ) {
121+ LOG .errorf ("%s extensions selected instead of 2" , selected .size ());
122+ return 1 ;
123+ } else {
124+ LOG .infof ("%s extensions selected" , selected .size ());
125+ }
116126
117- final ElementHandle downloadButton = page .waitForSelector (LABEL_DOWNLOAD_THE_ZIP );
127+ LOG .info ("Click on generate button" );
128+ generateButton .click ();
118129
130+ final ElementHandle downloadButton = page .waitForSelector (LABEL_DOWNLOAD_THE_ZIP );
131+
132+ Response response = page .waitForResponse (resp -> resp .url ().contains ("/d" ) && resp .status () == 200 , () -> {
119133 LOG .info ("Click on download button" );
120134 downloadButton .click ();
121-
122- LOG .info ("ACCEPTANCE TEST PASSED" );
135+ });
136+
137+ String contentType = response .headerValue ("Content-Type" );
138+ if (contentType != null && contentType .contains ("zip" )) {
139+ LOG .info ("Download link returned 200 and is a ZIP file" );
140+ } else {
141+ LOG .error ("Download link did not return a ZIP file" );
142+ return 1 ;
123143 }
144+
145+ LOG .infof ("ACCEPTANCE TEST PASSED FOR %s" , url );
124146 return 0 ;
125147 }
126148
0 commit comments