Skip to content

Commit a8ab2c9

Browse files
committed
feat: upload diffs when test fails
1 parent 6643e3b commit a8ab2c9

5 files changed

Lines changed: 73 additions & 16 deletions

File tree

actions/android/action.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ inputs:
1212
description: The project root directory
1313
required: false
1414
type: string
15+
uploadVisualTestArtifacts:
16+
description: Whether to upload visual test diff and actual images as artifacts
17+
required: false
18+
type: boolean
19+
default: 'true'
1520
runs:
1621
using: 'composite'
1722
steps:
@@ -112,3 +117,12 @@ runs:
112117
echo $(pwd)
113118
adb install -r ${{ inputs.app }}
114119
pnpm react-native-harness --harnessRunner ${{ inputs.runner }}
120+
- name: Upload visual test artifacts
121+
if: always() && inputs.uploadVisualTestArtifacts == 'true'
122+
uses: actions/upload-artifact@v4
123+
with:
124+
name: visual-test-diffs-android
125+
path: |
126+
${{ inputs.projectRoot }}/**/__image_snapshots__/**/*-diff.png
127+
${{ inputs.projectRoot }}/**/__image_snapshots__/**/*-actual.png
128+
if-no-files-found: ignore

actions/ios/action.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ inputs:
1212
description: The project root directory
1313
required: false
1414
type: string
15+
uploadVisualTestArtifacts:
16+
description: Whether to upload visual test diff and actual images as artifacts
17+
required: false
18+
type: boolean
19+
default: 'true'
1520
runs:
1621
using: 'composite'
1722
steps:
@@ -40,3 +45,12 @@ runs:
4045
working-directory: ${{ inputs.projectRoot }}
4146
run: |
4247
pnpm react-native-harness --harnessRunner ${{ inputs.runner }}
48+
- name: Upload visual test artifacts
49+
if: always() && inputs.uploadVisualTestArtifacts == 'true'
50+
uses: actions/upload-artifact@v4
51+
with:
52+
name: visual-test-diffs-ios
53+
path: |
54+
${{ inputs.projectRoot }}/**/__image_snapshots__/**/*-diff.png
55+
${{ inputs.projectRoot }}/**/__image_snapshots__/**/*-actual.png
56+
if-no-files-found: ignore

actions/shared/index.cjs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
2929
mod
3030
));
3131

32-
// ../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js
32+
// ../../node_modules/picocolors/picocolors.js
3333
var require_picocolors = __commonJS({
34-
"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js"(exports2, module2) {
34+
"../../node_modules/picocolors/picocolors.js"(exports2, module2) {
3535
"use strict";
3636
var p = process || {};
3737
var argv = p.argv || [];
@@ -102,9 +102,9 @@ var require_picocolors = __commonJS({
102102
}
103103
});
104104

105-
// ../../node_modules/.pnpm/sisteransi@1.0.5/node_modules/sisteransi/src/index.js
105+
// ../../node_modules/sisteransi/src/index.js
106106
var require_src = __commonJS({
107-
"../../node_modules/.pnpm/sisteransi@1.0.5/node_modules/sisteransi/src/index.js"(exports2, module2) {
107+
"../../node_modules/sisteransi/src/index.js"(exports2, module2) {
108108
"use strict";
109109
var ESC = "\x1B";
110110
var CSI = `${ESC}[`;
@@ -158,9 +158,9 @@ var require_src = __commonJS({
158158
}
159159
});
160160

161-
// ../../node_modules/.pnpm/is-unicode-supported@0.1.0/node_modules/is-unicode-supported/index.js
161+
// ../../node_modules/is-unicode-supported/index.js
162162
var require_is_unicode_supported = __commonJS({
163-
"../../node_modules/.pnpm/is-unicode-supported@0.1.0/node_modules/is-unicode-supported/index.js"(exports2, module2) {
163+
"../../node_modules/is-unicode-supported/index.js"(exports2, module2) {
164164
"use strict";
165165
module2.exports = () => {
166166
if (process.platform !== "win32") {
@@ -172,7 +172,7 @@ var require_is_unicode_supported = __commonJS({
172172
}
173173
});
174174

175-
// ../../node_modules/.pnpm/zod@3.25.67/node_modules/zod/dist/esm/v3/external.js
175+
// ../../node_modules/zod/dist/esm/v3/external.js
176176
var external_exports = {};
177177
__export(external_exports, {
178178
BRAND: () => BRAND,
@@ -284,7 +284,7 @@ __export(external_exports, {
284284
void: () => voidType
285285
});
286286

287-
// ../../node_modules/.pnpm/zod@3.25.67/node_modules/zod/dist/esm/v3/helpers/util.js
287+
// ../../node_modules/zod/dist/esm/v3/helpers/util.js
288288
var util;
289289
(function(util3) {
290290
util3.assertEqual = (_) => {
@@ -418,7 +418,7 @@ var getParsedType = (data) => {
418418
}
419419
};
420420

421-
// ../../node_modules/.pnpm/zod@3.25.67/node_modules/zod/dist/esm/v3/ZodError.js
421+
// ../../node_modules/zod/dist/esm/v3/ZodError.js
422422
var ZodIssueCode = util.arrayToEnum([
423423
"invalid_type",
424424
"invalid_literal",
@@ -535,7 +535,7 @@ ZodError.create = (issues) => {
535535
return error;
536536
};
537537

538-
// ../../node_modules/.pnpm/zod@3.25.67/node_modules/zod/dist/esm/v3/locales/en.js
538+
// ../../node_modules/zod/dist/esm/v3/locales/en.js
539539
var errorMap = (issue, _ctx) => {
540540
let message;
541541
switch (issue.code) {
@@ -636,7 +636,7 @@ var errorMap = (issue, _ctx) => {
636636
};
637637
var en_default = errorMap;
638638

639-
// ../../node_modules/.pnpm/zod@3.25.67/node_modules/zod/dist/esm/v3/errors.js
639+
// ../../node_modules/zod/dist/esm/v3/errors.js
640640
var overrideErrorMap = en_default;
641641
function setErrorMap(map) {
642642
overrideErrorMap = map;
@@ -645,7 +645,7 @@ function getErrorMap() {
645645
return overrideErrorMap;
646646
}
647647

648-
// ../../node_modules/.pnpm/zod@3.25.67/node_modules/zod/dist/esm/v3/helpers/parseUtil.js
648+
// ../../node_modules/zod/dist/esm/v3/helpers/parseUtil.js
649649
var makeIssue = (params) => {
650650
const { data, path: path4, errorMaps, issueData } = params;
651651
const fullPath = [...path4, ...issueData.path || []];
@@ -755,14 +755,14 @@ var isDirty = (x) => x.status === "dirty";
755755
var isValid = (x) => x.status === "valid";
756756
var isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise;
757757

758-
// ../../node_modules/.pnpm/zod@3.25.67/node_modules/zod/dist/esm/v3/helpers/errorUtil.js
758+
// ../../node_modules/zod/dist/esm/v3/helpers/errorUtil.js
759759
var errorUtil;
760760
(function(errorUtil2) {
761761
errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {};
762762
errorUtil2.toString = (message) => typeof message === "string" ? message : message?.message;
763763
})(errorUtil || (errorUtil = {}));
764764

765-
// ../../node_modules/.pnpm/zod@3.25.67/node_modules/zod/dist/esm/v3/types.js
765+
// ../../node_modules/zod/dist/esm/v3/types.js
766766
var ParseInputLazyPath = class {
767767
constructor(parent, value, path4, key) {
768768
this._cachedPath = [];
@@ -4214,6 +4214,7 @@ var ConfigSchema = external_exports.object({
42144214
appRegistryComponentName: external_exports.string().min(1, "App registry component name is required"),
42154215
runners: external_exports.array(external_exports.any()).min(1, "At least one runner is required"),
42164216
defaultRunner: external_exports.string().optional(),
4217+
webSocketPort: external_exports.number().optional().default(3001),
42174218
bridgeTimeout: external_exports.number().min(1e3, "Bridge timeout must be at least 1 second").default(6e4),
42184219
resetEnvironmentBetweenTestFiles: external_exports.boolean().optional().default(true),
42194220
unstable__skipAlreadyIncludedModules: external_exports.boolean().optional().default(false),
@@ -4233,7 +4234,7 @@ var ConfigSchema = external_exports.object({
42334234
// ../tools/dist/logger.js
42344235
var import_node_util2 = __toESM(require("util"), 1);
42354236

4236-
// ../../node_modules/.pnpm/@clack+core@1.0.0-alpha.5/node_modules/@clack/core/dist/index.mjs
4237+
// ../../node_modules/@clack/core/dist/index.mjs
42374238
var import_node_process = require("process");
42384239
var V = __toESM(require("readline"), 1);
42394240
var import_node_readline = __toESM(require("readline"), 1);
@@ -4251,7 +4252,7 @@ var C = { actions: new Set(gt), aliases: /* @__PURE__ */ new Map([["k", "up"], [
42514252
var At = globalThis.process.platform.startsWith("win");
42524253
var G = Symbol("clack:cancel");
42534254

4254-
// ../../node_modules/.pnpm/@clack+prompts@1.0.0-alpha.5/node_modules/@clack/prompts/dist/index.mjs
4255+
// ../../node_modules/@clack/prompts/dist/index.mjs
42554256
var import_picocolors = __toESM(require_picocolors(), 1);
42564257
var import_node_process2 = __toESM(require("process"), 1);
42574258
var import_node_fs = require("fs");

packages/github-action/src/android/action.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ inputs:
1212
description: The project root directory
1313
required: false
1414
type: string
15+
uploadVisualTestArtifacts:
16+
description: Whether to upload visual test diff and actual images as artifacts
17+
required: false
18+
type: boolean
19+
default: 'true'
1520
runs:
1621
using: 'composite'
1722
steps:
@@ -112,3 +117,12 @@ runs:
112117
echo $(pwd)
113118
adb install -r ${{ inputs.app }}
114119
pnpm react-native-harness --harnessRunner ${{ inputs.runner }}
120+
- name: Upload visual test artifacts
121+
if: always() && inputs.uploadVisualTestArtifacts == 'true'
122+
uses: actions/upload-artifact@v4
123+
with:
124+
name: visual-test-diffs-android
125+
path: |
126+
${{ inputs.projectRoot }}/**/__image_snapshots__/**/*-diff.png
127+
${{ inputs.projectRoot }}/**/__image_snapshots__/**/*-actual.png
128+
if-no-files-found: ignore

packages/github-action/src/ios/action.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ inputs:
1212
description: The project root directory
1313
required: false
1414
type: string
15+
uploadVisualTestArtifacts:
16+
description: Whether to upload visual test diff and actual images as artifacts
17+
required: false
18+
type: boolean
19+
default: 'true'
1520
runs:
1621
using: 'composite'
1722
steps:
@@ -40,3 +45,12 @@ runs:
4045
working-directory: ${{ inputs.projectRoot }}
4146
run: |
4247
pnpm react-native-harness --harnessRunner ${{ inputs.runner }}
48+
- name: Upload visual test artifacts
49+
if: always() && inputs.uploadVisualTestArtifacts == 'true'
50+
uses: actions/upload-artifact@v4
51+
with:
52+
name: visual-test-diffs-ios
53+
path: |
54+
${{ inputs.projectRoot }}/**/__image_snapshots__/**/*-diff.png
55+
${{ inputs.projectRoot }}/**/__image_snapshots__/**/*-actual.png
56+
if-no-files-found: ignore

0 commit comments

Comments
 (0)