@essential-apps/shopify-test-runner 1.0.12 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/edge/edgeProxy.d.ts.map +1 -1
- package/dist/edge/edgeProxy.js +18 -12
- package/dist/edge/edgeProxy.js.map +1 -1
- package/dist/lib/guestVnc.d.ts +31 -0
- package/dist/lib/guestVnc.d.ts.map +1 -0
- package/dist/lib/guestVnc.js +111 -0
- package/dist/lib/guestVnc.js.map +1 -0
- package/dist/probes/runProbe.js +0 -0
- package/dist/scripts/addStore.js +0 -0
- package/dist/scripts/buildImage.d.ts +3 -0
- package/dist/scripts/buildImage.d.ts.map +1 -0
- package/dist/scripts/{buildDockerImage.js → buildImage.js} +12 -10
- package/dist/scripts/buildImage.js.map +1 -0
- package/dist/scripts/captureAuth.js +0 -0
- package/dist/scripts/captureContracts.js +0 -0
- package/dist/scripts/captureRestContracts.js +0 -0
- package/dist/scripts/captureSharedContracts.d.ts +3 -0
- package/dist/scripts/captureSharedContracts.d.ts.map +1 -0
- package/dist/scripts/captureSharedContracts.js +209 -0
- package/dist/scripts/captureSharedContracts.js.map +1 -0
- package/dist/scripts/checkOperationCoverage.js +0 -0
- package/dist/scripts/cleanupStores.js +0 -0
- package/dist/scripts/createStores.js +0 -0
- package/dist/scripts/deployAppVersion.js +0 -0
- package/dist/scripts/devOnlineBackend.js +0 -0
- package/dist/scripts/installApp.js +0 -0
- package/dist/scripts/listStores.js +0 -0
- package/dist/scripts/runOffline.js +78 -1
- package/dist/scripts/runOffline.js.map +1 -1
- package/dist/scripts/runOfflineFullTests.js +49 -21
- package/dist/scripts/runOfflineFullTests.js.map +1 -1
- package/dist/scripts/runTests.js +0 -0
- package/dist/scripts/runVm.js +0 -0
- package/dist/scripts/runVmAuth.js +0 -0
- package/dist/scripts/setupTestDb.js +0 -0
- package/dist/scripts/verifyContracts.js +20 -29
- package/dist/scripts/verifyContracts.js.map +1 -1
- package/dist/scripts/verifyRestContracts.js +17 -30
- package/dist/scripts/verifyRestContracts.js.map +1 -1
- package/package.json +11 -9
- package/src/edge/edgeProxy.ts +19 -12
- package/src/lib/guestVnc.ts +147 -0
- package/src/scripts/{buildDockerImage.ts → buildImage.ts} +11 -9
- package/src/scripts/captureSharedContracts.ts +228 -0
- package/src/scripts/runOffline.ts +82 -1
- package/src/scripts/runOfflineFullTests.ts +56 -21
- package/src/scripts/verifyContracts.ts +22 -38
- package/src/scripts/verifyRestContracts.ts +23 -42
- package/dist/edge/nodeShim.d.ts +0 -2
- package/dist/edge/nodeShim.d.ts.map +0 -1
- package/dist/edge/nodeShim.js +0 -217
- package/dist/edge/nodeShim.js.map +0 -1
- package/dist/scripts/_probeSourceUrl.d.ts +0 -3
- package/dist/scripts/_probeSourceUrl.d.ts.map +0 -1
- package/dist/scripts/_probeSourceUrl.js +0 -119
- package/dist/scripts/_probeSourceUrl.js.map +0 -1
- package/dist/scripts/buildDockerImage.d.ts +0 -3
- package/dist/scripts/buildDockerImage.d.ts.map +0 -1
- package/dist/scripts/buildDockerImage.js.map +0 -1
- package/dist/scripts/devE2eBackend.d.ts +0 -3
- package/dist/scripts/devE2eBackend.d.ts.map +0 -1
- package/dist/scripts/devE2eBackend.js +0 -117
- package/dist/scripts/devE2eBackend.js.map +0 -1
- package/dist/scripts/runDocker.d.ts +0 -3
- package/dist/scripts/runDocker.d.ts.map +0 -1
- package/dist/scripts/runDocker.js +0 -88
- package/dist/scripts/runDocker.js.map +0 -1
- package/dist/scripts/runDockerAuth.d.ts +0 -3
- package/dist/scripts/runDockerAuth.d.ts.map +0 -1
- package/dist/scripts/runDockerAuth.js +0 -108
- package/dist/scripts/runDockerAuth.js.map +0 -1
- package/dist/scripts/runDockerOffline.d.ts +0 -3
- package/dist/scripts/runDockerOffline.d.ts.map +0 -1
- package/dist/scripts/runDockerOffline.js +0 -129
- package/dist/scripts/runDockerOffline.js.map +0 -1
- package/dist/scripts/runDockerOfflineExplore.d.ts +0 -3
- package/dist/scripts/runDockerOfflineExplore.d.ts.map +0 -1
- package/dist/scripts/runDockerOfflineExplore.js +0 -116
- package/dist/scripts/runDockerOfflineExplore.js.map +0 -1
- package/dist/scripts/runIsolatedDockerOffline.d.ts +0 -3
- package/dist/scripts/runIsolatedDockerOffline.d.ts.map +0 -1
- package/dist/scripts/runIsolatedDockerOffline.js +0 -351
- package/dist/scripts/runIsolatedDockerOffline.js.map +0 -1
- package/dist/scripts/runOfflineE2e.d.ts +0 -3
- package/dist/scripts/runOfflineE2e.d.ts.map +0 -1
- package/dist/scripts/runOfflineE2e.js +0 -408
- package/dist/scripts/runOfflineE2e.js.map +0 -1
- package/dist/scripts/runSupermachine.d.ts +0 -3
- package/dist/scripts/runSupermachine.d.ts.map +0 -1
- package/dist/scripts/runSupermachine.js +0 -474
- package/dist/scripts/runSupermachine.js.map +0 -1
- package/dist/scripts/runSupermachineAuth.d.ts +0 -3
- package/dist/scripts/runSupermachineAuth.d.ts.map +0 -1
- package/dist/scripts/runSupermachineAuth.js +0 -454
- package/dist/scripts/runSupermachineAuth.js.map +0 -1
- package/dist/vite/offlineConfig.d.ts +0 -34
- package/dist/vite/offlineConfig.d.ts.map +0 -1
- package/dist/vite/offlineConfig.js +0 -61
- package/dist/vite/offlineConfig.js.map +0 -1
- package/src/scripts/runDockerAuth.ts +0 -120
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyContracts.js","sourceRoot":"","sources":["../../src/scripts/verifyContracts.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"verifyContracts.js","sourceRoot":"","sources":["../../src/scripts/verifyContracts.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAC7F,OAAO,EACL,cAAc,EACd,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAU9D,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAS;QAChB,GAAG,EAAE,OAAO;QACZ,YAAY,EAAE,EAAE;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACnB,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9C,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAChD,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACtB,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,8BAA8B,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAmBD,sFAAsF;AACtF,SAAS,oBAAoB,CAAC,GAAY,EAAE,KAAgB;IAC1D,MAAM,GAAG,GACP,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,MAAM,QAAQ,GACZ,GAAG,KAAK,OAAO;QACb,CAAC,CAAC,iCAAiC;QACnC,CAAC,CAAC,2BAA2B,CAAC;IAClC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;YACvC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,wBAAwB,EAAE,mBAAmB;aAC9C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gBAAgB;IACvB,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC;QAC1B,IAAI,EAAE;YACJ,MAAM,EAAE,yBAAyB;YACjC,gBAAgB,EAAE,yBAAyB;SAC5C;KACF,CAAC,CAAC;IACH,KAAK,CAAC,UAAU,CAAC;QACf,EAAE,EAAE,WAAW;QACf,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,sDAAsD;QACnE,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,eAAe;QACvB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE;YACR;gBACE,EAAE,EAAE,WAAW;gBACf,KAAK,EAAE,eAAe;gBACtB,KAAK,EAAE,IAAI;gBACX,SAAS,EAAE,IAAI;gBACf,GAAG,EAAE,UAAU;gBACf,kBAAkB,EAAE,GAAG;gBACvB,gBAAgB,EAAE,CAAC,eAAe,CAAC;aACpC;SACF;QACD,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IACH,KAAK,CAAC,aAAa,CAAC;QAClB,EAAE,EAAE,WAAW;QACf,MAAM,EAAE,mBAAmB;QAC3B,KAAK,EAAE,mBAAmB;QAC1B,cAAc,EAAE,CAAC,gBAAgB,CAAC;KACnC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,IAAI,CACX,QAAiB,EACjB,MAAe,EACf,IAAI,GAAG,GAAG;IAEV,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,IACE,OAAO,QAAQ,KAAK,OAAO,MAAM;QACjC,QAAQ,KAAK,IAAI;QACjB,MAAM,KAAK,IAAI,EACf,CAAC;QACD,OAAO,GAAG,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,GAAG,IAAI,8BAA8B,CAAC;QACzE,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,GAAG,IAAI,qBAAqB,QAAQ,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7E,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,QAAmC,CAAC;QAC9C,MAAM,CAAC,GAAG,MAAiC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAAE,OAAO,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC;YACrD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAAE,OAAO,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC;YAClD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,oEAAoE;IACpE,gEAAgE;IAChE,kEAAkE;IAClE,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAChF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CACX,2CAA2C,IAAI,CAAC,GAAG,GAAG;YACpD,qBAAqB,IAAI,CAAC,YAAY,IAAI,CAC7C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;IAC/C,OAAO,CAAC,GAAG,CACT,0BAA0B,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,MAAM,cAAc;QAClE,IAAI,WAAW,YAAY,QAAQ,sBAAsB,CAC5D,CAAC;IAEF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,MAAM,QAAQ,GACZ,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAExC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,QAAQ,GAAyC,EAAE,CAAC;IAE1D,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;QACzD,4DAA4D;QAC5D,+DAA+D;QAC/D,gBAAgB;QAChB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;YACR,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,mBAAoB,GAAa,CAAC,OAAO,EAAE;aAClD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,uDAAuD;QACvD,0DAA0D;QAC1D,sDAAsD;QACtD,0DAA0D;QAC1D,0DAA0D;QAC1D,2DAA2D;QAC3D,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,IAAI,EAAE,CAAC;QACT,CAAC;aAAM,CAAC;YACN,KAAK,EAAE,CAAC;YACR,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,0BAA0B,IAAI,CAAC,GAAG,KAAK,IAAI,UAAU,KAAK,WAAW,OAAO,4BAA4B,CACzG,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,4GAA4G,CAC7G,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
* GraphQL verifier uses. Offline-offline matches byte-for-byte
|
|
21
21
|
* anyway; the normaliser only matters for live-vs-contract.
|
|
22
22
|
*/
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
23
|
+
import { resolve } from 'node:path';
|
|
24
|
+
import { resolveRestContracts, } from '@essential-apps/shopify-test-contracts/operation-contract';
|
|
25
25
|
import { createAdminApi, } from '@essential-apps/shopify-test-shopify-api';
|
|
26
26
|
import { ShopState } from '@essential-apps/shopify-test-storefront';
|
|
27
27
|
import { normaliseResponse } from '../contracts/normalize.js';
|
|
@@ -142,38 +142,25 @@ function diff(expected, actual, path = '$') {
|
|
|
142
142
|
}
|
|
143
143
|
async function main() {
|
|
144
144
|
const args = parseArgs();
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
console.error(`[verify-rest] no contracts directory at ${args.contractsDir}. ` +
|
|
151
|
-
`Run \`npm run test:online:capture-rest-contracts\` first.`);
|
|
152
|
-
process.exit(2);
|
|
153
|
-
}
|
|
154
|
-
const contractFiles = entries.filter((f) => f.endsWith('.json'));
|
|
155
|
-
if (contractFiles.length === 0) {
|
|
156
|
-
console.error(`[verify-rest] no contracts found in ${args.contractsDir}`);
|
|
145
|
+
// Merged view: shared package REST goldens overlaid by the app's
|
|
146
|
+
// local admin-rest dir (app wins by operation name).
|
|
147
|
+
const resolved = resolveRestContracts({ appDir: args.contractsDir });
|
|
148
|
+
if (resolved.length === 0) {
|
|
149
|
+
console.error(`[verify-rest] no REST contracts (shared package + ${args.contractsDir}).`);
|
|
157
150
|
process.exit(2);
|
|
158
151
|
}
|
|
152
|
+
const sharedCount = resolved.filter((r) => r.origin === 'shared').length;
|
|
153
|
+
console.log(`[verify-rest] ${resolved.length} operations ` +
|
|
154
|
+
`(${sharedCount} shared, ${resolved.length - sharedCount} app-local override)`);
|
|
159
155
|
const state = buildSeededState();
|
|
160
156
|
const executor = buildOfflineExecutor(state);
|
|
161
157
|
let pass = 0;
|
|
162
158
|
let drift = 0;
|
|
163
159
|
let skipped = 0;
|
|
164
160
|
const failures = [];
|
|
165
|
-
for (const
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
try {
|
|
169
|
-
st = statSync(path);
|
|
170
|
-
}
|
|
171
|
-
catch {
|
|
172
|
-
continue;
|
|
173
|
-
}
|
|
174
|
-
if (!st.isFile())
|
|
175
|
-
continue;
|
|
176
|
-
const contract = JSON.parse(readFileSync(path, 'utf8'));
|
|
161
|
+
for (const entry of resolved) {
|
|
162
|
+
const contract = entry.contract;
|
|
163
|
+
const label = `${entry.operationName} [${entry.origin}]`;
|
|
177
164
|
if (contract.warning) {
|
|
178
165
|
skipped++;
|
|
179
166
|
continue;
|
|
@@ -184,14 +171,14 @@ async function main() {
|
|
|
184
171
|
}
|
|
185
172
|
catch (err) {
|
|
186
173
|
drift++;
|
|
187
|
-
failures.push({ contract:
|
|
174
|
+
failures.push({ contract: label, diff: `executor threw: ${err.message}` });
|
|
188
175
|
continue;
|
|
189
176
|
}
|
|
190
177
|
// Status-code mismatch is a hard diff — surface it directly.
|
|
191
178
|
if (actual.status !== contract.response.status) {
|
|
192
179
|
drift++;
|
|
193
180
|
failures.push({
|
|
194
|
-
contract:
|
|
181
|
+
contract: label,
|
|
195
182
|
diff: `$.status: expected ${contract.response.status}, got ${actual.status}`,
|
|
196
183
|
});
|
|
197
184
|
continue;
|
|
@@ -206,7 +193,7 @@ async function main() {
|
|
|
206
193
|
}
|
|
207
194
|
else {
|
|
208
195
|
drift++;
|
|
209
|
-
failures.push({ contract:
|
|
196
|
+
failures.push({ contract: label, diff: d });
|
|
210
197
|
}
|
|
211
198
|
}
|
|
212
199
|
console.log(`[verify-rest]: ${pass} pass, ${drift} drift, ${skipped} skipped`);
|
|
@@ -214,7 +201,7 @@ async function main() {
|
|
|
214
201
|
console.log('');
|
|
215
202
|
console.log('[verify-rest] drift:');
|
|
216
203
|
for (const f of failures) {
|
|
217
|
-
console.log(` ${
|
|
204
|
+
console.log(` ${f.contract}`);
|
|
218
205
|
console.log(` ${f.diff}`);
|
|
219
206
|
}
|
|
220
207
|
console.log('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyRestContracts.js","sourceRoot":"","sources":["../../src/scripts/verifyRestContracts.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"verifyRestContracts.js","sourceRoot":"","sources":["../../src/scripts/verifyRestContracts.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@essential-apps/shopify-test-runner",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.14",
|
|
4
4
|
"description": "Orchestration scripts (container, auth capture, install) and Playwright config preset for Essential Apps' Shopify test suites. Internal use only.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
"./contracts/normalize-html": {
|
|
22
22
|
"types": "./dist/contracts/normalizeHtml.d.ts",
|
|
23
23
|
"import": "./dist/contracts/normalizeHtml.js"
|
|
24
|
-
}
|
|
24
|
+
},
|
|
25
|
+
"./package.json": "./package.json"
|
|
25
26
|
},
|
|
26
27
|
"bin": {
|
|
27
28
|
"shopify-test-run-online": "./dist/scripts/runVm.js",
|
|
28
29
|
"shopify-test-run-offline": "./dist/scripts/runOffline.js",
|
|
29
30
|
"shopify-test-run-tests": "./dist/scripts/runTests.js",
|
|
30
31
|
"shopify-test-capture-online-auth": "./dist/scripts/runVmAuth.js",
|
|
31
|
-
"shopify-test-capture-online-auth-libkrun": "./dist/scripts/runDockerAuth.js",
|
|
32
32
|
"shopify-test-capture-auth": "./dist/scripts/captureAuth.js",
|
|
33
33
|
"shopify-test-deploy-app-version": "./dist/scripts/deployAppVersion.js",
|
|
34
34
|
"shopify-test-install-app": "./dist/scripts/installApp.js",
|
|
@@ -40,9 +40,10 @@
|
|
|
40
40
|
"shopify-test-dev-backend": "./dist/scripts/devOnlineBackend.js",
|
|
41
41
|
"shopify-test-run-offline-full-tests": "./dist/scripts/runOfflineFullTests.js",
|
|
42
42
|
"shopify-test-probe": "./dist/probes/runProbe.js",
|
|
43
|
-
"shopify-test-build-image": "./dist/scripts/
|
|
43
|
+
"shopify-test-build-image": "./dist/scripts/buildImage.js",
|
|
44
44
|
"shopify-test-check-operation-coverage": "./dist/scripts/checkOperationCoverage.js",
|
|
45
45
|
"shopify-test-capture-contracts": "./dist/scripts/captureContracts.js",
|
|
46
|
+
"shopify-test-capture-shared-contracts": "./dist/scripts/captureSharedContracts.js",
|
|
46
47
|
"shopify-test-verify-contracts": "./dist/scripts/verifyContracts.js",
|
|
47
48
|
"shopify-test-capture-rest-contracts": "./dist/scripts/captureRestContracts.js",
|
|
48
49
|
"shopify-test-verify-rest-contracts": "./dist/scripts/verifyRestContracts.js"
|
|
@@ -57,11 +58,12 @@
|
|
|
57
58
|
"clean": "rm -rf dist"
|
|
58
59
|
},
|
|
59
60
|
"dependencies": {
|
|
60
|
-
"@essential-apps/shopify-test-core": "^1.0.
|
|
61
|
-
"@essential-apps/shopify-test-
|
|
62
|
-
"@essential-apps/shopify-test-
|
|
63
|
-
"@essential-apps/shopify-test-
|
|
64
|
-
"@essential-apps/shopify-test-
|
|
61
|
+
"@essential-apps/shopify-test-core": "^1.0.14",
|
|
62
|
+
"@essential-apps/shopify-test-contracts": "^1.0.14",
|
|
63
|
+
"@essential-apps/shopify-test-mock-admin": "^1.0.14",
|
|
64
|
+
"@essential-apps/shopify-test-shopify-api": "^1.0.14",
|
|
65
|
+
"@essential-apps/shopify-test-storefront": "^1.0.14",
|
|
66
|
+
"@essential-apps/shopify-test-themes": "^1.0.14",
|
|
65
67
|
"@playwright/test": "^1.49.0",
|
|
66
68
|
"@types/node": "^20.19.40",
|
|
67
69
|
"@types/tar-stream": "^3.1.4",
|
package/src/edge/edgeProxy.ts
CHANGED
|
@@ -300,18 +300,25 @@ export async function startEdgeProxy(opts: EdgeOptions): Promise<StartedEdge> {
|
|
|
300
300
|
// Shopify sets these on cdn.shopify.com responses too. Allow
|
|
301
301
|
// everything because this is a test-only proxy bound to
|
|
302
302
|
// 127.0.0.1 — no real traffic ever reaches it.
|
|
303
|
-
if
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
303
|
+
// Set each CORS header only if the upstream didn't already — and
|
|
304
|
+
// check CASE-INSENSITIVELY. The upstream mocks set them lowercased
|
|
305
|
+
// (`access-control-allow-origin`); a PascalCase existence check
|
|
306
|
+
// misses that, so we'd add a SECOND header and emit the illegal
|
|
307
|
+
// multi-value `Access-Control-Allow-Origin: *, *`, which Chrome
|
|
308
|
+
// rejects — blocking every mirrored font (cdn.shopify.com Inter,
|
|
309
|
+
// fonts.shopifycdn.com Assistant). Reuse the upstream's own key
|
|
310
|
+
// casing when present so we never duplicate.
|
|
311
|
+
const corsDefaults: Record<string, string> = {
|
|
312
|
+
'access-control-allow-origin': '*',
|
|
313
|
+
'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE, OPTIONS',
|
|
314
|
+
'access-control-allow-headers': '*',
|
|
315
|
+
'access-control-expose-headers': '*',
|
|
316
|
+
};
|
|
317
|
+
const existingLowerKeys = new Set(
|
|
318
|
+
Object.keys(outHeaders).map((k) => k.toLowerCase()),
|
|
319
|
+
);
|
|
320
|
+
for (const [name, value] of Object.entries(corsDefaults)) {
|
|
321
|
+
if (!existingLowerKeys.has(name)) outHeaders[name] = value;
|
|
315
322
|
}
|
|
316
323
|
|
|
317
324
|
// Short-circuit CORS preflights (the upstream mock might not
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expose a guest VM's Xvfb display over VNC to the host.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the interactive VM flows that need a developer to *see*
|
|
5
|
+
* what a headed Chromium is doing inside the microVM:
|
|
6
|
+
* - `runVmAuth.ts` — one-time Shopify login capture.
|
|
7
|
+
* - `runOffline.ts` (explore mode) — click through the offline mock
|
|
8
|
+
* stack (admin app + storefront) by hand.
|
|
9
|
+
*
|
|
10
|
+
* The sequence (extracted so both flows share one implementation):
|
|
11
|
+
* 1. (Re)start Xvfb :99 with access control off, then x11vnc bound
|
|
12
|
+
* to 0.0.0.0:5900 inside the guest.
|
|
13
|
+
* 2. Forward host 127.0.0.1:5900 → guest :5900 via `vm.exposeTcp`.
|
|
14
|
+
* 3. On macOS, open Screen Sharing at vnc://localhost:5900 with the
|
|
15
|
+
* password prefilled. Elsewhere, print connect instructions.
|
|
16
|
+
*
|
|
17
|
+
* Returns the TCP forwarder handle so the caller can keep it alive
|
|
18
|
+
* for the session and close it on teardown.
|
|
19
|
+
*/
|
|
20
|
+
import { spawn as nodeSpawn } from 'node:child_process';
|
|
21
|
+
import { platform as osPlatform } from 'node:os';
|
|
22
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
23
|
+
|
|
24
|
+
/** Minimal structural view of the VM handle this helper needs. */
|
|
25
|
+
export interface VncCapableVm {
|
|
26
|
+
exec(opts: {
|
|
27
|
+
argv: string[];
|
|
28
|
+
timeoutMs?: number;
|
|
29
|
+
}): Promise<{ exitCode: number; stdout: Buffer; stderr: Buffer }>;
|
|
30
|
+
exposeTcp(hostPort: number, guestPort: number): Promise<unknown>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const DEFAULT_VNC_PORT = 5900;
|
|
34
|
+
|
|
35
|
+
export interface ExposeGuestVncOptions {
|
|
36
|
+
/** VNC auth password. Default: TEST_ONLINE_VNC_PASSWORD ?? 'test'. */
|
|
37
|
+
vncPassword?: string;
|
|
38
|
+
/** Host+guest VNC port. Default: 5900. */
|
|
39
|
+
port?: number;
|
|
40
|
+
/** Xvfb virtual screen geometry. Default: '1600x1000x24'. */
|
|
41
|
+
screen?: string;
|
|
42
|
+
/** Log prefix, e.g. '[runOffline]'. Default: '[guestVnc]'. */
|
|
43
|
+
logPrefix?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Start x11vnc in the guest, bridge it to the host, and (on macOS)
|
|
48
|
+
* open Screen Sharing. Throws if Xvfb or x11vnc fail to come up.
|
|
49
|
+
*
|
|
50
|
+
* @returns the forwarder handle (keep it referenced; close on exit).
|
|
51
|
+
*/
|
|
52
|
+
export async function exposeGuestVnc(
|
|
53
|
+
vm: VncCapableVm,
|
|
54
|
+
opts: ExposeGuestVncOptions = {},
|
|
55
|
+
): Promise<unknown> {
|
|
56
|
+
const vncPassword =
|
|
57
|
+
opts.vncPassword ?? process.env['TEST_ONLINE_VNC_PASSWORD'] ?? 'test';
|
|
58
|
+
const port = opts.port ?? DEFAULT_VNC_PORT;
|
|
59
|
+
const screen = opts.screen ?? '1600x1000x24';
|
|
60
|
+
const log = opts.logPrefix ?? '[guestVnc]';
|
|
61
|
+
|
|
62
|
+
// 1) (Re)start Xvfb :99 + x11vnc inside the guest. We restart Xvfb
|
|
63
|
+
// with -ac (access control off) so x11vnc — launched from this
|
|
64
|
+
// fresh exec shell, without the entrypoint's Xauthority — can
|
|
65
|
+
// attach without a cookie. Background via shell `&` + nohup so
|
|
66
|
+
// both survive this exec returning.
|
|
67
|
+
console.error(`${log} starting x11vnc on guest :${port}…`);
|
|
68
|
+
const vncStart = await vm.exec({
|
|
69
|
+
argv: [
|
|
70
|
+
'bash',
|
|
71
|
+
'-c',
|
|
72
|
+
`
|
|
73
|
+
# No set -e: pkill/rm of absent things exit nonzero legitimately.
|
|
74
|
+
# Match Xvfb by exact name (-x), NOT -f: -f matches this script's
|
|
75
|
+
# own argv (the heredoc contains "Xvfb") and would kill our shell.
|
|
76
|
+
echo "[xvfb] restarting Xvfb :99 ${screen} -ac …"
|
|
77
|
+
pkill -x Xvfb 2>/dev/null || true
|
|
78
|
+
rm -f /tmp/.X11-unix/X99 /tmp/.X99-lock
|
|
79
|
+
sleep 0.3
|
|
80
|
+
nohup Xvfb :99 -screen 0 ${screen} -nolisten tcp -ac \
|
|
81
|
+
>/var/log/xvfb.log 2>&1 &
|
|
82
|
+
for _ in $(seq 1 50); do
|
|
83
|
+
[ -e /tmp/.X11-unix/X99 ] && break
|
|
84
|
+
sleep 0.1
|
|
85
|
+
done
|
|
86
|
+
if [ ! -e /tmp/.X11-unix/X99 ]; then
|
|
87
|
+
echo "[xvfb] FAILED to bind /tmp/.X11-unix/X99 within 5s"
|
|
88
|
+
cat /var/log/xvfb.log
|
|
89
|
+
exit 1
|
|
90
|
+
fi
|
|
91
|
+
echo "[xvfb] up."
|
|
92
|
+
|
|
93
|
+
mkdir -p /root/.vnc
|
|
94
|
+
x11vnc -storepasswd "${vncPassword}" /root/.vnc/passwd >/dev/null 2>&1
|
|
95
|
+
echo "[x11vnc] starting on :${port}…"
|
|
96
|
+
nohup x11vnc -display :99 -forever -shared \
|
|
97
|
+
-rfbauth /root/.vnc/passwd -rfbport ${port} -quiet \
|
|
98
|
+
>/var/log/x11vnc.log 2>&1 &
|
|
99
|
+
echo "[x11vnc] pid $!"
|
|
100
|
+
# Confirm the listener bound. netstat (net-tools) is in the image;
|
|
101
|
+
# bash /dev/tcp is unreliable on jammy (device sometimes disabled).
|
|
102
|
+
for _ in $(seq 1 30); do
|
|
103
|
+
if netstat -ltn 2>/dev/null | grep -q ":${port} "; then
|
|
104
|
+
exit 0
|
|
105
|
+
fi
|
|
106
|
+
sleep 0.1
|
|
107
|
+
done
|
|
108
|
+
echo "x11vnc didn't bind :${port} within 3s"
|
|
109
|
+
netstat -ltn 2>&1 || echo "(netstat unavailable)"
|
|
110
|
+
cat /var/log/x11vnc.log
|
|
111
|
+
exit 1
|
|
112
|
+
`,
|
|
113
|
+
],
|
|
114
|
+
timeoutMs: 15_000,
|
|
115
|
+
});
|
|
116
|
+
if (vncStart.exitCode !== 0) {
|
|
117
|
+
console.error(
|
|
118
|
+
`${log} x11vnc failed:`,
|
|
119
|
+
vncStart.stdout.toString(),
|
|
120
|
+
vncStart.stderr.toString(),
|
|
121
|
+
);
|
|
122
|
+
throw new Error('x11vnc startup failed');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// 2) Bridge host 127.0.0.1:port → guest :port.
|
|
126
|
+
const forwarder = await vm.exposeTcp(port, port);
|
|
127
|
+
console.error(`${log} forwarding host 127.0.0.1:${port} → guest :${port}`);
|
|
128
|
+
|
|
129
|
+
// 3) Open a viewer (macOS Screen Sharing), password prefilled.
|
|
130
|
+
if (osPlatform() === 'darwin') {
|
|
131
|
+
// Tiny delay so the accept loop is warm before the client dials,
|
|
132
|
+
// else Screen Sharing intermittently shows "connection refused".
|
|
133
|
+
await sleep(500);
|
|
134
|
+
const vncUrl = `vnc://:${encodeURIComponent(vncPassword)}@localhost:${port}`;
|
|
135
|
+
console.error(
|
|
136
|
+
`${log} opening macOS Screen Sharing → vnc://localhost:${port} (password prefilled)`,
|
|
137
|
+
);
|
|
138
|
+
console.error(`${log} (if nothing opens: open '${vncUrl}')`);
|
|
139
|
+
nodeSpawn('open', [vncUrl], { stdio: 'ignore', detached: true }).unref();
|
|
140
|
+
} else {
|
|
141
|
+
console.error(
|
|
142
|
+
`${log} connect any VNC viewer to localhost:${port} (password: ${vncPassword}).`,
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return forwarder;
|
|
147
|
+
}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Build the canonical `shopify-test` image
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Build the canonical `shopify-test` VM image via Apple's `container
|
|
4
|
+
* build` (NOT docker — we don't use docker for any test path). The
|
|
5
|
+
* image spec is the bundled `docker/Dockerfile`; Dockerfile syntax is
|
|
6
|
+
* what `container build` consumes, and the directory name is
|
|
7
|
+
* historical. supermachine restores microVMs from the built image.
|
|
6
8
|
*
|
|
7
|
-
*
|
|
9
|
+
* Run directly:
|
|
8
10
|
*
|
|
9
|
-
*
|
|
11
|
+
* node --import tsx packages/runner/src/scripts/buildImage.ts
|
|
10
12
|
*
|
|
11
|
-
*
|
|
13
|
+
* or via the exposed bin `shopify-test-build-image`.
|
|
12
14
|
*
|
|
13
15
|
* The image is amd64-only (Rosetta on Apple Silicon) — see
|
|
14
16
|
* docker/README.md for why.
|
|
@@ -22,7 +24,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
22
24
|
// inspecting `container images` sees the same name they `npm install`.
|
|
23
25
|
const DEFAULT_TAG = 'essential-apps/shopify-test:latest';
|
|
24
26
|
|
|
25
|
-
function
|
|
27
|
+
function imageContextDir(): string {
|
|
26
28
|
// This file lives at packages/runner/src/scripts/ (or dist/scripts/
|
|
27
29
|
// after build). Walk up + sideways to docker/.
|
|
28
30
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
@@ -42,10 +44,10 @@ function dockerContextDir(): string {
|
|
|
42
44
|
|
|
43
45
|
async function main(): Promise<void> {
|
|
44
46
|
const tag = process.env['SHOPIFY_TEST_IMAGE_TAG'] ?? DEFAULT_TAG;
|
|
45
|
-
const context =
|
|
47
|
+
const context = imageContextDir();
|
|
46
48
|
|
|
47
49
|
console.log('────────────────────────────────────────────────────────────');
|
|
48
|
-
console.log(' shopify-test
|
|
50
|
+
console.log(' shopify-test VM image build (Apple `container build`)');
|
|
49
51
|
console.log('────────────────────────────────────────────────────────────');
|
|
50
52
|
console.log(` Tag : ${tag}`);
|
|
51
53
|
console.log(` Context : ${context}`);
|