@sentry/wizard 6.12.0 → 6.13.0
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/CHANGELOG.md +15 -0
- package/dist/bin.js +16 -1
- package/dist/bin.js.map +1 -1
- package/dist/e2e-tests/tests/angular-17.test.js +3 -4
- package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
- package/dist/e2e-tests/tests/angular-19.test.js +3 -4
- package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
- package/dist/e2e-tests/tests/flutter.test.js +60 -0
- package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
- package/dist/e2e-tests/tests/help-message.test.js +8 -3
- package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-3.test.js +12 -6
- package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-4.test.js +12 -6
- package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
- package/dist/e2e-tests/tests/pnpm-workspace.test.js +6 -3
- package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js +4 -4
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-router.test.js +3 -6
- package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
- package/dist/e2e-tests/tests/remix.test.js +2 -4
- package/dist/e2e-tests/tests/remix.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js +24 -8
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js +6 -3
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
- package/dist/lib/Constants.d.ts +1 -0
- package/dist/lib/Constants.js +5 -0
- package/dist/lib/Constants.js.map +1 -1
- package/dist/lib/Steps/Integrations/Electron.js +2 -2
- package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
- package/dist/src/android/android-wizard.js +3 -0
- package/dist/src/android/android-wizard.js.map +1 -1
- package/dist/src/angular/codemods/main.d.ts +1 -1
- package/dist/src/angular/codemods/main.js +0 -1
- package/dist/src/angular/codemods/main.js.map +1 -1
- package/dist/src/apple/apple-wizard.js +2 -3
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/apple/check-installed-cli.d.ts +1 -1
- package/dist/src/apple/check-installed-cli.js +13 -7
- package/dist/src/apple/check-installed-cli.js.map +1 -1
- package/dist/src/apple/configure-xcode-project.js +8 -1
- package/dist/src/apple/configure-xcode-project.js.map +1 -1
- package/dist/src/apple/lookup-xcode-project.d.ts +8 -5
- package/dist/src/apple/lookup-xcode-project.js +22 -17
- package/dist/src/apple/lookup-xcode-project.js.map +1 -1
- package/dist/src/apple/options.d.ts +5 -0
- package/dist/src/apple/options.js.map +1 -1
- package/dist/src/apple/sentry-swift-package.d.ts +4 -0
- package/dist/src/apple/sentry-swift-package.js +17 -0
- package/dist/src/apple/sentry-swift-package.js.map +1 -0
- package/dist/src/apple/snapshots/apple-snapshots-wizard.d.ts +2 -0
- package/dist/src/apple/snapshots/apple-snapshots-wizard.js +251 -0
- package/dist/src/apple/snapshots/apple-snapshots-wizard.js.map +1 -0
- package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.d.ts +13 -0
- package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.js +48 -0
- package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.js.map +1 -0
- package/dist/src/apple/snapshots/snapshot-test-file.d.ts +18 -0
- package/dist/src/apple/snapshots/snapshot-test-file.js +122 -0
- package/dist/src/apple/snapshots/snapshot-test-file.js.map +1 -0
- package/dist/src/apple/snapshots/snapshot-verification-scheme.d.ts +6 -0
- package/dist/src/apple/snapshots/snapshot-verification-scheme.js +147 -0
- package/dist/src/apple/snapshots/snapshot-verification-scheme.js.map +1 -0
- package/dist/src/apple/snapshots/snapshotpreviews-package.d.ts +4 -0
- package/dist/src/apple/snapshots/snapshotpreviews-package.js +8 -0
- package/dist/src/apple/snapshots/snapshotpreviews-package.js.map +1 -0
- package/dist/src/apple/snapshots/snapshots-cli-preflight.d.ts +23 -0
- package/dist/src/apple/snapshots/snapshots-cli-preflight.js +136 -0
- package/dist/src/apple/snapshots/snapshots-cli-preflight.js.map +1 -0
- package/dist/src/apple/xcode-manager.d.ts +59 -1
- package/dist/src/apple/xcode-manager.js +507 -106
- package/dist/src/apple/xcode-manager.js.map +1 -1
- package/dist/src/flutter/flutter-wizard.js +3 -0
- package/dist/src/flutter/flutter-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.js +12 -6
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/nuxt/templates.js +12 -6
- package/dist/src/nuxt/templates.js.map +1 -1
- package/dist/src/react-router/codemods/client.entry.d.ts +1 -1
- package/dist/src/react-router/codemods/client.entry.js +93 -52
- package/dist/src/react-router/codemods/client.entry.js.map +1 -1
- package/dist/src/react-router/codemods/server-entry.js +8 -7
- package/dist/src/react-router/codemods/server-entry.js.map +1 -1
- package/dist/src/react-router/react-router-wizard.js +13 -19
- package/dist/src/react-router/react-router-wizard.js.map +1 -1
- package/dist/src/react-router/sdk-setup.d.ts +2 -2
- package/dist/src/react-router/sdk-setup.js +16 -15
- package/dist/src/react-router/sdk-setup.js.map +1 -1
- package/dist/src/react-router/templates.d.ts +1 -3
- package/dist/src/react-router/templates.js +24 -92
- package/dist/src/react-router/templates.js.map +1 -1
- package/dist/src/remix/sdk-setup.js +1 -2
- package/dist/src/remix/sdk-setup.js.map +1 -1
- package/dist/src/run.d.ts +4 -1
- package/dist/src/run.js +13 -0
- package/dist/src/run.js.map +1 -1
- package/dist/src/sourcemaps/tools/remix.js +4 -4
- package/dist/src/sourcemaps/tools/remix.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup/setup.js +17 -4
- package/dist/src/sveltekit/sdk-setup/setup.js.map +1 -1
- package/dist/src/sveltekit/templates.js +12 -6
- package/dist/src/sveltekit/templates.js.map +1 -1
- package/dist/src/utils/clack/index.d.ts +2 -1
- package/dist/src/utils/clack/index.js +17 -6
- package/dist/src/utils/clack/index.js.map +1 -1
- package/dist/src/utils/files.d.ts +2 -0
- package/dist/src/utils/files.js +58 -0
- package/dist/src/utils/files.js.map +1 -0
- package/dist/src/utils/git.d.ts +3 -1
- package/dist/src/utils/git.js +2 -1
- package/dist/src/utils/git.js.map +1 -1
- package/dist/src/utils/line-endings.d.ts +1 -0
- package/dist/src/utils/line-endings.js +76 -0
- package/dist/src/utils/line-endings.js.map +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/test/angular/angular-wizard.test.js +0 -5
- package/dist/test/angular/angular-wizard.test.js.map +1 -1
- package/dist/test/apple/lookup-xcode-project.test.js +167 -0
- package/dist/test/apple/lookup-xcode-project.test.js.map +1 -0
- package/dist/test/apple/snapshots/apple-snapshots-wizard.test.d.ts +1 -0
- package/dist/test/apple/snapshots/apple-snapshots-wizard.test.js +487 -0
- package/dist/test/apple/snapshots/apple-snapshots-wizard.test.js.map +1 -0
- package/dist/test/apple/snapshots/hosted-test-target-fixture.d.ts +24 -0
- package/dist/test/apple/snapshots/hosted-test-target-fixture.js +191 -0
- package/dist/test/apple/snapshots/hosted-test-target-fixture.js.map +1 -0
- package/dist/test/apple/snapshots/snapshot-test-file.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshot-test-file.test.js +110 -0
- package/dist/test/apple/snapshots/snapshot-test-file.test.js.map +1 -0
- package/dist/test/apple/snapshots/snapshot-verification-scheme.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshot-verification-scheme.test.js +146 -0
- package/dist/test/apple/snapshots/snapshot-verification-scheme.test.js.map +1 -0
- package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.js +186 -0
- package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.js.map +1 -0
- package/dist/test/apple/snapshots/snapshots-cli-preflight.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshots-cli-preflight.test.js +192 -0
- package/dist/test/apple/snapshots/snapshots-cli-preflight.test.js.map +1 -0
- package/dist/test/apple/snapshots/source-file-insertion.test.d.ts +1 -0
- package/dist/test/apple/snapshots/source-file-insertion.test.js +77 -0
- package/dist/test/apple/snapshots/source-file-insertion.test.js.map +1 -0
- package/dist/test/apple/xcode-manager.test.js +452 -43
- package/dist/test/apple/xcode-manager.test.js.map +1 -1
- package/dist/test/constants.test.d.ts +1 -0
- package/dist/test/constants.test.js +12 -0
- package/dist/test/constants.test.js.map +1 -0
- package/dist/test/nextjs/templates.test.js +66 -33
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/nuxt/templates.test.js +66 -36
- package/dist/test/nuxt/templates.test.js.map +1 -1
- package/dist/test/react-router/codemods/client-entry.test.js +15 -11
- package/dist/test/react-router/codemods/client-entry.test.js.map +1 -1
- package/dist/test/react-router/codemods/server-entry.test.js +21 -8
- package/dist/test/react-router/codemods/server-entry.test.js.map +1 -1
- package/dist/test/react-router/sdk-setup.test.js +46 -10
- package/dist/test/react-router/sdk-setup.test.js.map +1 -1
- package/dist/test/react-router/templates.test.js +26 -64
- package/dist/test/react-router/templates.test.js.map +1 -1
- package/dist/test/remix/build-script.test.d.ts +1 -0
- package/dist/test/remix/build-script.test.js +124 -0
- package/dist/test/remix/build-script.test.js.map +1 -0
- package/dist/test/remix/client-entry.test.js +4 -10
- package/dist/test/remix/client-entry.test.js.map +1 -1
- package/dist/test/run.test.d.ts +1 -0
- package/dist/test/run.test.js +137 -0
- package/dist/test/run.test.js.map +1 -0
- package/dist/test/sveltekit/templates.test.js +78 -27
- package/dist/test/sveltekit/templates.test.js.map +1 -1
- package/dist/test/utils/clack/index.test.js +101 -0
- package/dist/test/utils/clack/index.test.js.map +1 -1
- package/dist/test/utils/git.test.js +10 -0
- package/dist/test/utils/git.test.js.map +1 -1
- package/dist/test/utils/line-endings.test.d.ts +1 -0
- package/dist/test/utils/line-endings.test.js +103 -0
- package/dist/test/utils/line-endings.test.js.map +1 -0
- package/package.json +2 -2
- package/dist/src/react-router/codemods/root.d.ts +0 -1
- package/dist/src/react-router/codemods/root.js +0 -170
- package/dist/src/react-router/codemods/root.js.map +0 -1
- package/dist/test/react-router/codemods/root.test.js +0 -182
- package/dist/test/react-router/codemods/root.test.js.map +0 -1
- /package/dist/test/{react-router/codemods/root.test.d.ts → apple/lookup-xcode-project.test.d.ts} +0 -0
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const fs = __importStar(require("node:fs"));
|
|
27
|
+
const os = __importStar(require("node:os"));
|
|
28
|
+
const path = __importStar(require("node:path"));
|
|
29
|
+
const vitest_1 = require("vitest");
|
|
30
|
+
const mocks = vitest_1.vi.hoisted(() => ({
|
|
31
|
+
abort: vitest_1.vi.fn(),
|
|
32
|
+
askForItemSelection: vitest_1.vi.fn(),
|
|
33
|
+
checkInstalledCLISnapshots: vitest_1.vi.fn(),
|
|
34
|
+
confirm: vitest_1.vi.fn(),
|
|
35
|
+
confirmContinueIfNoOrDirtyGitRepo: vitest_1.vi.fn(),
|
|
36
|
+
configureSnapshotPreviewsXcodeProject: vitest_1.vi.fn(),
|
|
37
|
+
ensureSnapshotTestFile: vitest_1.vi.fn(),
|
|
38
|
+
error: vitest_1.vi.fn(),
|
|
39
|
+
info: vitest_1.vi.fn(),
|
|
40
|
+
lookupXcodeProject: vitest_1.vi.fn(),
|
|
41
|
+
outro: vitest_1.vi.fn(),
|
|
42
|
+
printWelcome: vitest_1.vi.fn(),
|
|
43
|
+
resolveSnapshotVerificationSchemeName: vitest_1.vi.fn(),
|
|
44
|
+
success: vitest_1.vi.fn(),
|
|
45
|
+
warn: vitest_1.vi.fn(),
|
|
46
|
+
withTelemetry: vitest_1.vi.fn(async (_options, callback) => await callback()),
|
|
47
|
+
write: vitest_1.vi.fn(),
|
|
48
|
+
}));
|
|
49
|
+
vitest_1.vi.mock('@clack/prompts', () => ({
|
|
50
|
+
default: {
|
|
51
|
+
confirm: mocks.confirm,
|
|
52
|
+
log: {
|
|
53
|
+
error: mocks.error,
|
|
54
|
+
info: mocks.info,
|
|
55
|
+
success: mocks.success,
|
|
56
|
+
warn: mocks.warn,
|
|
57
|
+
},
|
|
58
|
+
outro: mocks.outro,
|
|
59
|
+
},
|
|
60
|
+
}));
|
|
61
|
+
vitest_1.vi.mock('../../../src/telemetry', () => ({
|
|
62
|
+
withTelemetry: mocks.withTelemetry,
|
|
63
|
+
}));
|
|
64
|
+
vitest_1.vi.mock('../../../src/utils/clack', () => ({
|
|
65
|
+
abort: mocks.abort,
|
|
66
|
+
abortIfCancelled: async (value) => await value,
|
|
67
|
+
askForItemSelection: mocks.askForItemSelection,
|
|
68
|
+
confirmContinueIfNoOrDirtyGitRepo: mocks.confirmContinueIfNoOrDirtyGitRepo,
|
|
69
|
+
printWelcome: mocks.printWelcome,
|
|
70
|
+
}));
|
|
71
|
+
vitest_1.vi.mock('../../../src/apple/lookup-xcode-project', () => ({
|
|
72
|
+
lookupXcodeProject: mocks.lookupXcodeProject,
|
|
73
|
+
selectXcodeTarget: async (xcodeProject, options = {}) => {
|
|
74
|
+
const targetNames = options.targetNames ?? xcodeProject.getAllTargets();
|
|
75
|
+
if (targetNames.length === 1) {
|
|
76
|
+
return targetNames[0];
|
|
77
|
+
}
|
|
78
|
+
const askForItemSelection = mocks.askForItemSelection;
|
|
79
|
+
const selection = await askForItemSelection(targetNames, options.promptMessage ?? 'Which target do you want to add Sentry to?');
|
|
80
|
+
return selection.value;
|
|
81
|
+
},
|
|
82
|
+
}));
|
|
83
|
+
vitest_1.vi.mock('../../../src/apple/snapshots/snapshot-test-file', () => ({
|
|
84
|
+
ensureSnapshotTestFile: mocks.ensureSnapshotTestFile,
|
|
85
|
+
snapshotTestClassName: (hostedTestTargetName) => `${hostedTestTargetName}SnapshotTest`,
|
|
86
|
+
snapshotTestTemplate: (className) => `import SnapshottingTests
|
|
87
|
+
|
|
88
|
+
final class ${className}: SnapshotTest {
|
|
89
|
+
override class func snapshotPreviews() -> [String]? { nil }
|
|
90
|
+
override class func excludedSnapshotPreviews() -> [String]? { nil }
|
|
91
|
+
override class func snapshotPreviewModules() -> [String]? { nil }
|
|
92
|
+
override class func excludedSnapshotPreviewModules() -> [String]? { nil }
|
|
93
|
+
}
|
|
94
|
+
`,
|
|
95
|
+
}));
|
|
96
|
+
vitest_1.vi.mock('../../../src/apple/snapshots/configure-snapshotpreviews-xcode-project', () => ({
|
|
97
|
+
configureSnapshotPreviewsXcodeProject: mocks.configureSnapshotPreviewsXcodeProject,
|
|
98
|
+
}));
|
|
99
|
+
vitest_1.vi.mock('../../../src/apple/snapshots/snapshots-cli-preflight', () => ({
|
|
100
|
+
checkInstalledCLISnapshots: mocks.checkInstalledCLISnapshots,
|
|
101
|
+
}));
|
|
102
|
+
vitest_1.vi.mock('../../../src/apple/snapshots/snapshot-verification-scheme', () => ({
|
|
103
|
+
resolveSnapshotVerificationSchemeName: mocks.resolveSnapshotVerificationSchemeName,
|
|
104
|
+
}));
|
|
105
|
+
const apple_snapshots_wizard_1 = require("../../../src/apple/snapshots/apple-snapshots-wizard");
|
|
106
|
+
(0, vitest_1.describe)('runAppleSnapshotsWizard', () => {
|
|
107
|
+
(0, vitest_1.beforeEach)(() => {
|
|
108
|
+
vitest_1.vi.clearAllMocks();
|
|
109
|
+
mocks.ensureSnapshotTestFile.mockReturnValue({
|
|
110
|
+
changed: true,
|
|
111
|
+
className: 'AppTestsSnapshotTest',
|
|
112
|
+
filePath: '/tmp/AppTestsSnapshotTest.swift',
|
|
113
|
+
included: true,
|
|
114
|
+
});
|
|
115
|
+
mocks.configureSnapshotPreviewsXcodeProject.mockReturnValue({
|
|
116
|
+
changed: true,
|
|
117
|
+
failedSnapshotPreferencesTargetNames: [],
|
|
118
|
+
linked: true,
|
|
119
|
+
});
|
|
120
|
+
mocks.resolveSnapshotVerificationSchemeName.mockReturnValue('AppScheme');
|
|
121
|
+
mocks.askForItemSelection.mockResolvedValue({ value: 'App' });
|
|
122
|
+
mocks.confirm.mockResolvedValue(false);
|
|
123
|
+
mocks.abort.mockRejectedValue(new Error('aborted'));
|
|
124
|
+
});
|
|
125
|
+
(0, vitest_1.it)('links SnapshotPreferences only to the selected app target', async () => {
|
|
126
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
|
|
127
|
+
const selectedPreviewFile = path.join(tempDir, 'SelectedView.swift');
|
|
128
|
+
const otherPreviewFile = path.join(tempDir, 'OtherView.swift');
|
|
129
|
+
fs.writeFileSync(selectedPreviewFile, '#Preview { SelectedView() }', 'utf8');
|
|
130
|
+
fs.writeFileSync(otherPreviewFile, '#Preview { OtherView() }', 'utf8');
|
|
131
|
+
mocks.askForItemSelection.mockResolvedValue({ value: 'App' });
|
|
132
|
+
const xcodeProject = {
|
|
133
|
+
getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
|
|
134
|
+
getSourceFilesForTarget: vitest_1.vi.fn((targetName) => targetName === 'App' ? [selectedPreviewFile] : [otherPreviewFile]),
|
|
135
|
+
getAllTargets: vitest_1.vi.fn(() => ['App', 'OtherApp']),
|
|
136
|
+
getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
|
|
137
|
+
getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
|
|
138
|
+
'AppTests',
|
|
139
|
+
]),
|
|
140
|
+
getUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
|
|
141
|
+
write: mocks.write,
|
|
142
|
+
xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
|
|
143
|
+
};
|
|
144
|
+
mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
|
|
145
|
+
await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
|
|
146
|
+
telemetryEnabled: true,
|
|
147
|
+
projectDir: tempDir,
|
|
148
|
+
promoCode: 'CAM',
|
|
149
|
+
ignoreGitChanges: true,
|
|
150
|
+
nonInteractive: false,
|
|
151
|
+
});
|
|
152
|
+
(0, vitest_1.expect)(mocks.askForItemSelection).toHaveBeenCalledWith(['App', 'OtherApp'], 'Which app target should SnapshotPreviews use?');
|
|
153
|
+
(0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
|
|
154
|
+
xcodeProject,
|
|
155
|
+
hostedTestTargetName: 'AppTests',
|
|
156
|
+
previewTargetNames: ['App'],
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
(0, vitest_1.it)('prompts only among unit-test targets hosted by the selected app target', async () => {
|
|
160
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
|
|
161
|
+
const previewFile = path.join(tempDir, 'ContentView.swift');
|
|
162
|
+
fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');
|
|
163
|
+
mocks.askForItemSelection.mockResolvedValue({
|
|
164
|
+
value: 'AppSnapshotTests',
|
|
165
|
+
});
|
|
166
|
+
const xcodeProject = {
|
|
167
|
+
getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
|
|
168
|
+
getSourceFilesForTarget: vitest_1.vi.fn(() => [previewFile]),
|
|
169
|
+
getAllTargets: vitest_1.vi.fn(() => ['App']),
|
|
170
|
+
getHostedUnitTestTargetNames: vitest_1.vi.fn(() => [
|
|
171
|
+
'AppTests',
|
|
172
|
+
'AppSnapshotTests',
|
|
173
|
+
]),
|
|
174
|
+
getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
|
|
175
|
+
'AppTests',
|
|
176
|
+
'AppSnapshotTests',
|
|
177
|
+
]),
|
|
178
|
+
write: mocks.write,
|
|
179
|
+
xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
|
|
180
|
+
};
|
|
181
|
+
mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
|
|
182
|
+
await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
|
|
183
|
+
telemetryEnabled: true,
|
|
184
|
+
projectDir: tempDir,
|
|
185
|
+
promoCode: 'CAM',
|
|
186
|
+
ignoreGitChanges: true,
|
|
187
|
+
nonInteractive: false,
|
|
188
|
+
});
|
|
189
|
+
(0, vitest_1.expect)(xcodeProject.getHostedUnitTestTargetNamesForApplicationTarget).toHaveBeenCalledWith('App');
|
|
190
|
+
(0, vitest_1.expect)(mocks.askForItemSelection).toHaveBeenCalledWith(['AppTests', 'AppSnapshotTests'], 'Which test target should render SnapshotPreviews?');
|
|
191
|
+
(0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
|
|
192
|
+
xcodeProject,
|
|
193
|
+
hostedTestTargetName: 'AppSnapshotTests',
|
|
194
|
+
previewTargetNames: ['App'],
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
(0, vitest_1.it)('links SnapshotPreferences to the selected app target without scanning for Swift previews', async () => {
|
|
198
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
|
|
199
|
+
const selectedFile = path.join(tempDir, 'SelectedView.swift');
|
|
200
|
+
const otherPreviewFile = path.join(tempDir, 'OtherView.swift');
|
|
201
|
+
fs.writeFileSync(selectedFile, 'struct SelectedView {}', 'utf8');
|
|
202
|
+
fs.writeFileSync(otherPreviewFile, '#Preview { OtherView() }', 'utf8');
|
|
203
|
+
mocks.askForItemSelection.mockResolvedValue({ value: 'App' });
|
|
204
|
+
const xcodeProject = {
|
|
205
|
+
getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
|
|
206
|
+
getSourceFilesForTarget: vitest_1.vi.fn((targetName) => targetName === 'App' ? [selectedFile] : [otherPreviewFile]),
|
|
207
|
+
getAllTargets: vitest_1.vi.fn(() => ['App', 'OtherApp']),
|
|
208
|
+
getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
|
|
209
|
+
getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
|
|
210
|
+
'AppTests',
|
|
211
|
+
]),
|
|
212
|
+
getUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
|
|
213
|
+
write: mocks.write,
|
|
214
|
+
xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
|
|
215
|
+
};
|
|
216
|
+
mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
|
|
217
|
+
await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
|
|
218
|
+
telemetryEnabled: true,
|
|
219
|
+
projectDir: tempDir,
|
|
220
|
+
promoCode: 'CAM',
|
|
221
|
+
ignoreGitChanges: true,
|
|
222
|
+
nonInteractive: false,
|
|
223
|
+
});
|
|
224
|
+
(0, vitest_1.expect)(mocks.confirm).not.toHaveBeenCalled();
|
|
225
|
+
(0, vitest_1.expect)(xcodeProject.getSourceFilesForTarget).not.toHaveBeenCalled();
|
|
226
|
+
(0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
|
|
227
|
+
xcodeProject,
|
|
228
|
+
hostedTestTargetName: 'AppTests',
|
|
229
|
+
previewTargetNames: ['App'],
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
(0, vitest_1.it)('warns when optional SnapshotPreferences linking fails', async () => {
|
|
233
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
|
|
234
|
+
const previewFile = path.join(tempDir, 'ContentView.swift');
|
|
235
|
+
fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');
|
|
236
|
+
mocks.configureSnapshotPreviewsXcodeProject.mockReturnValue({
|
|
237
|
+
changed: true,
|
|
238
|
+
failedSnapshotPreferencesTargetNames: ['App'],
|
|
239
|
+
linked: true,
|
|
240
|
+
});
|
|
241
|
+
const xcodeProject = {
|
|
242
|
+
getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
|
|
243
|
+
getSourceFilesForTarget: vitest_1.vi.fn(() => [previewFile]),
|
|
244
|
+
getAllTargets: vitest_1.vi.fn(() => ['App']),
|
|
245
|
+
getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
|
|
246
|
+
getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
|
|
247
|
+
'AppTests',
|
|
248
|
+
]),
|
|
249
|
+
getUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
|
|
250
|
+
write: mocks.write,
|
|
251
|
+
xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
|
|
252
|
+
};
|
|
253
|
+
mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
|
|
254
|
+
await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
|
|
255
|
+
telemetryEnabled: true,
|
|
256
|
+
projectDir: tempDir,
|
|
257
|
+
promoCode: 'CAM',
|
|
258
|
+
ignoreGitChanges: true,
|
|
259
|
+
nonInteractive: false,
|
|
260
|
+
});
|
|
261
|
+
(0, vitest_1.expect)(mocks.warn).toHaveBeenCalledWith(vitest_1.expect.stringContaining('SnapshotPreferences could not be linked to App'));
|
|
262
|
+
(0, vitest_1.expect)(mocks.checkInstalledCLISnapshots).toHaveBeenCalledTimes(1);
|
|
263
|
+
});
|
|
264
|
+
(0, vitest_1.it)('links SnapshotPreferences in non-interactive mode without scanning for Swift previews', async () => {
|
|
265
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
|
|
266
|
+
const selectedFile = path.join(tempDir, 'SelectedView.swift');
|
|
267
|
+
fs.writeFileSync(selectedFile, 'struct SelectedView {}', 'utf8');
|
|
268
|
+
const xcodeProject = {
|
|
269
|
+
getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
|
|
270
|
+
getSourceFilesForTarget: vitest_1.vi.fn(() => [selectedFile]),
|
|
271
|
+
getAllTargets: vitest_1.vi.fn(() => ['App']),
|
|
272
|
+
getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
|
|
273
|
+
getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
|
|
274
|
+
'AppTests',
|
|
275
|
+
]),
|
|
276
|
+
write: mocks.write,
|
|
277
|
+
xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
|
|
278
|
+
};
|
|
279
|
+
mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
|
|
280
|
+
await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
|
|
281
|
+
telemetryEnabled: true,
|
|
282
|
+
projectDir: tempDir,
|
|
283
|
+
promoCode: 'CAM',
|
|
284
|
+
ignoreGitChanges: true,
|
|
285
|
+
nonInteractive: true,
|
|
286
|
+
});
|
|
287
|
+
(0, vitest_1.expect)(mocks.confirm).not.toHaveBeenCalled();
|
|
288
|
+
(0, vitest_1.expect)(xcodeProject.getSourceFilesForTarget).not.toHaveBeenCalled();
|
|
289
|
+
(0, vitest_1.expect)(mocks.info).not.toHaveBeenCalledWith(vitest_1.expect.stringContaining('Continuing without Swift previews'));
|
|
290
|
+
(0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
|
|
291
|
+
xcodeProject,
|
|
292
|
+
hostedTestTargetName: 'AppTests',
|
|
293
|
+
previewTargetNames: ['App'],
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
(0, vitest_1.it)('uses explicit app and hosted XCTest targets without prompting', async () => {
|
|
297
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
|
|
298
|
+
const previewFile = path.join(tempDir, 'ContentView.swift');
|
|
299
|
+
fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');
|
|
300
|
+
const xcodeProject = {
|
|
301
|
+
getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
|
|
302
|
+
getSourceFilesForTarget: vitest_1.vi.fn(() => [previewFile]),
|
|
303
|
+
getAllTargets: vitest_1.vi.fn(() => ['App', 'OtherApp']),
|
|
304
|
+
getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
|
|
305
|
+
getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => []),
|
|
306
|
+
write: mocks.write,
|
|
307
|
+
xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
|
|
308
|
+
};
|
|
309
|
+
mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
|
|
310
|
+
await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
|
|
311
|
+
appTarget: 'App',
|
|
312
|
+
hostedTestTarget: 'AppTests',
|
|
313
|
+
telemetryEnabled: true,
|
|
314
|
+
projectDir: tempDir,
|
|
315
|
+
promoCode: 'CAM',
|
|
316
|
+
ignoreGitChanges: true,
|
|
317
|
+
nonInteractive: true,
|
|
318
|
+
});
|
|
319
|
+
(0, vitest_1.expect)(mocks.askForItemSelection).not.toHaveBeenCalled();
|
|
320
|
+
(0, vitest_1.expect)(mocks.confirmContinueIfNoOrDirtyGitRepo).toHaveBeenCalledWith({
|
|
321
|
+
ignoreGitChanges: true,
|
|
322
|
+
cwd: tempDir,
|
|
323
|
+
nonInteractive: true,
|
|
324
|
+
});
|
|
325
|
+
(0, vitest_1.expect)(mocks.lookupXcodeProject).toHaveBeenCalledWith({
|
|
326
|
+
projectDir: tempDir,
|
|
327
|
+
nonInteractive: true,
|
|
328
|
+
});
|
|
329
|
+
(0, vitest_1.expect)(mocks.checkInstalledCLISnapshots).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ nonInteractive: true }));
|
|
330
|
+
(0, vitest_1.expect)(xcodeProject.getHostedUnitTestTargetNamesForApplicationTarget).not.toHaveBeenCalled();
|
|
331
|
+
(0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
|
|
332
|
+
xcodeProject,
|
|
333
|
+
hostedTestTargetName: 'AppTests',
|
|
334
|
+
previewTargetNames: ['App'],
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
(0, vitest_1.it)('falls back to prompting among hosted XCTest targets when app-specific matching is inconclusive', async () => {
|
|
338
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
|
|
339
|
+
const previewFile = path.join(tempDir, 'ContentView.swift');
|
|
340
|
+
fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');
|
|
341
|
+
mocks.askForItemSelection.mockResolvedValue({
|
|
342
|
+
value: 'AppSnapshotTests',
|
|
343
|
+
});
|
|
344
|
+
const xcodeProject = {
|
|
345
|
+
getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
|
|
346
|
+
getSourceFilesForTarget: vitest_1.vi.fn(() => [previewFile]),
|
|
347
|
+
getAllTargets: vitest_1.vi.fn(() => ['App']),
|
|
348
|
+
getHostedUnitTestTargetNames: vitest_1.vi.fn(() => [
|
|
349
|
+
'AppTests',
|
|
350
|
+
'AppSnapshotTests',
|
|
351
|
+
]),
|
|
352
|
+
getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => []),
|
|
353
|
+
write: mocks.write,
|
|
354
|
+
xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
|
|
355
|
+
};
|
|
356
|
+
mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
|
|
357
|
+
await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
|
|
358
|
+
telemetryEnabled: true,
|
|
359
|
+
projectDir: tempDir,
|
|
360
|
+
promoCode: 'CAM',
|
|
361
|
+
ignoreGitChanges: true,
|
|
362
|
+
nonInteractive: false,
|
|
363
|
+
});
|
|
364
|
+
(0, vitest_1.expect)(mocks.warn).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Could not automatically match'));
|
|
365
|
+
(0, vitest_1.expect)(mocks.askForItemSelection).toHaveBeenCalledWith(['AppTests', 'AppSnapshotTests'], 'Which hosted XCTest target should render SnapshotPreviews?');
|
|
366
|
+
(0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
|
|
367
|
+
xcodeProject,
|
|
368
|
+
hostedTestTargetName: 'AppSnapshotTests',
|
|
369
|
+
previewTargetNames: ['App'],
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
(0, vitest_1.it)('aborts when app target selection is ambiguous in non-interactive mode', async () => {
|
|
373
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
|
|
374
|
+
const xcodeProject = {
|
|
375
|
+
getAllTargets: vitest_1.vi.fn(() => ['App', 'OtherApp']),
|
|
376
|
+
xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
|
|
377
|
+
};
|
|
378
|
+
mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
|
|
379
|
+
await (0, vitest_1.expect)((0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
|
|
380
|
+
telemetryEnabled: true,
|
|
381
|
+
projectDir: tempDir,
|
|
382
|
+
promoCode: 'CAM',
|
|
383
|
+
ignoreGitChanges: true,
|
|
384
|
+
nonInteractive: true,
|
|
385
|
+
})).rejects.toThrow('aborted');
|
|
386
|
+
(0, vitest_1.expect)(mocks.askForItemSelection).not.toHaveBeenCalled();
|
|
387
|
+
(0, vitest_1.expect)(mocks.error).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Pass --app-target <target-name>'));
|
|
388
|
+
(0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).not.toHaveBeenCalled();
|
|
389
|
+
(0, vitest_1.expect)(mocks.abort).toHaveBeenCalledWith('Apple Snapshots setup did not complete.');
|
|
390
|
+
(0, vitest_1.expect)(mocks.outro).not.toHaveBeenCalledWith('Apple Snapshots setup did not complete.');
|
|
391
|
+
});
|
|
392
|
+
(0, vitest_1.it)('aborts with manual instructions instead of prompting when hosted XCTest fallback is ambiguous in non-interactive mode', async () => {
|
|
393
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
|
|
394
|
+
const xcodeProject = {
|
|
395
|
+
getAllTargets: vitest_1.vi.fn(() => ['App']),
|
|
396
|
+
getHostedUnitTestTargetNames: vitest_1.vi.fn(() => [
|
|
397
|
+
'AppTests',
|
|
398
|
+
'AppSnapshotTests',
|
|
399
|
+
]),
|
|
400
|
+
getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => []),
|
|
401
|
+
xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
|
|
402
|
+
};
|
|
403
|
+
mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
|
|
404
|
+
await (0, vitest_1.expect)((0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
|
|
405
|
+
telemetryEnabled: true,
|
|
406
|
+
projectDir: tempDir,
|
|
407
|
+
promoCode: 'CAM',
|
|
408
|
+
ignoreGitChanges: true,
|
|
409
|
+
nonInteractive: true,
|
|
410
|
+
})).rejects.toThrow('aborted');
|
|
411
|
+
(0, vitest_1.expect)(mocks.askForItemSelection).not.toHaveBeenCalled();
|
|
412
|
+
(0, vitest_1.expect)(mocks.error).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Pass --hosted-test-target <target-name>'));
|
|
413
|
+
(0, vitest_1.expect)(mocks.error).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Manual setup:'));
|
|
414
|
+
(0, vitest_1.expect)(mocks.error).toHaveBeenCalledWith(vitest_1.expect.stringContaining('import SnapshottingTests'));
|
|
415
|
+
(0, vitest_1.expect)(mocks.error).toHaveBeenCalledWith(vitest_1.expect.stringContaining('final class AppTestsSnapshotTest'));
|
|
416
|
+
(0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).not.toHaveBeenCalled();
|
|
417
|
+
(0, vitest_1.expect)(mocks.abort).toHaveBeenCalledWith('Apple Snapshots setup did not complete.');
|
|
418
|
+
(0, vitest_1.expect)(mocks.outro).not.toHaveBeenCalledWith('Apple Snapshots setup did not complete.');
|
|
419
|
+
});
|
|
420
|
+
(0, vitest_1.it)('wires the Apple Snapshots flow without Sentry auth/runtime/CI mutation', async () => {
|
|
421
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
|
|
422
|
+
const previewFile = path.join(tempDir, 'ContentView.swift');
|
|
423
|
+
fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');
|
|
424
|
+
fs.writeFileSync(path.join(tempDir, 'Package.swift'), '', 'utf8');
|
|
425
|
+
const xcodeProject = {
|
|
426
|
+
getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
|
|
427
|
+
getSourceFilesForTarget: vitest_1.vi.fn(() => [previewFile]),
|
|
428
|
+
getAllTargets: vitest_1.vi.fn(() => ['App']),
|
|
429
|
+
getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
|
|
430
|
+
getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
|
|
431
|
+
'AppTests',
|
|
432
|
+
]),
|
|
433
|
+
getUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
|
|
434
|
+
write: mocks.write,
|
|
435
|
+
xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
|
|
436
|
+
};
|
|
437
|
+
mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
|
|
438
|
+
await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
|
|
439
|
+
telemetryEnabled: true,
|
|
440
|
+
projectDir: tempDir,
|
|
441
|
+
promoCode: 'CAM',
|
|
442
|
+
ignoreGitChanges: true,
|
|
443
|
+
nonInteractive: false,
|
|
444
|
+
});
|
|
445
|
+
(0, vitest_1.expect)(mocks.withTelemetry).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ integration: 'appleSnapshots' }), vitest_1.expect.any(Function));
|
|
446
|
+
(0, vitest_1.expect)(mocks.printWelcome).toHaveBeenCalledWith({
|
|
447
|
+
wizardName: 'Sentry Apple Snapshots Wizard',
|
|
448
|
+
promoCode: 'CAM',
|
|
449
|
+
});
|
|
450
|
+
(0, vitest_1.expect)(mocks.confirmContinueIfNoOrDirtyGitRepo).toHaveBeenCalledWith({
|
|
451
|
+
ignoreGitChanges: true,
|
|
452
|
+
cwd: tempDir,
|
|
453
|
+
nonInteractive: false,
|
|
454
|
+
});
|
|
455
|
+
(0, vitest_1.expect)(mocks.lookupXcodeProject).toHaveBeenCalledWith({
|
|
456
|
+
projectDir: tempDir,
|
|
457
|
+
nonInteractive: false,
|
|
458
|
+
});
|
|
459
|
+
(0, vitest_1.expect)(mocks.confirm).not.toHaveBeenCalled();
|
|
460
|
+
(0, vitest_1.expect)(mocks.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining('SnapshotPreferences in Swift preview files'));
|
|
461
|
+
(0, vitest_1.expect)(mocks.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining('This wizard does not edit SwiftPM manifests'));
|
|
462
|
+
(0, vitest_1.expect)(mocks.ensureSnapshotTestFile).toHaveBeenCalledWith({
|
|
463
|
+
xcodeProject,
|
|
464
|
+
hostedTestTargetName: 'AppTests',
|
|
465
|
+
});
|
|
466
|
+
(0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
|
|
467
|
+
xcodeProject,
|
|
468
|
+
hostedTestTargetName: 'AppTests',
|
|
469
|
+
previewTargetNames: ['App'],
|
|
470
|
+
});
|
|
471
|
+
(0, vitest_1.expect)(mocks.write).toHaveBeenCalledTimes(1);
|
|
472
|
+
(0, vitest_1.expect)(mocks.checkInstalledCLISnapshots).toHaveBeenCalledWith({
|
|
473
|
+
projectDir: tempDir,
|
|
474
|
+
nonInteractive: false,
|
|
475
|
+
verificationGuidance: {
|
|
476
|
+
appId: 'com.getsentry.App',
|
|
477
|
+
hostedTestTargetName: 'AppTests',
|
|
478
|
+
projectDir: tempDir,
|
|
479
|
+
projectPath: path.join(tempDir, 'App.xcodeproj'),
|
|
480
|
+
schemeName: 'AppScheme',
|
|
481
|
+
snapshotTestClassName: 'AppTestsSnapshotTest',
|
|
482
|
+
},
|
|
483
|
+
});
|
|
484
|
+
(0, vitest_1.expect)(mocks.outro).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Apple Snapshots setup complete.'));
|
|
485
|
+
});
|
|
486
|
+
});
|
|
487
|
+
//# sourceMappingURL=apple-snapshots-wizard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apple-snapshots-wizard.test.js","sourceRoot":"","sources":["../../../../test/apple/snapshots/apple-snapshots-wizard.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { beforeEach, describe, expect, it, vi } from 'vitest';\n\nconst mocks = vi.hoisted(() => ({\n abort: vi.fn(),\n askForItemSelection: vi.fn(),\n checkInstalledCLISnapshots: vi.fn(),\n confirm: vi.fn(),\n confirmContinueIfNoOrDirtyGitRepo: vi.fn(),\n configureSnapshotPreviewsXcodeProject: vi.fn(),\n ensureSnapshotTestFile: vi.fn(),\n error: vi.fn(),\n info: vi.fn(),\n lookupXcodeProject: vi.fn(),\n outro: vi.fn(),\n printWelcome: vi.fn(),\n resolveSnapshotVerificationSchemeName: vi.fn(),\n success: vi.fn(),\n warn: vi.fn(),\n withTelemetry: vi.fn(\n async (_options: { integration: string }, callback: () => Promise<void>) =>\n await callback(),\n ),\n write: vi.fn(),\n}));\n\nvi.mock('@clack/prompts', () => ({\n default: {\n confirm: mocks.confirm,\n log: {\n error: mocks.error,\n info: mocks.info,\n success: mocks.success,\n warn: mocks.warn,\n },\n outro: mocks.outro,\n },\n}));\n\nvi.mock('../../../src/telemetry', () => ({\n withTelemetry: mocks.withTelemetry,\n}));\n\nvi.mock('../../../src/utils/clack', () => ({\n abort: mocks.abort,\n abortIfCancelled: async <T>(value: T | Promise<T>) => await value,\n askForItemSelection: mocks.askForItemSelection,\n confirmContinueIfNoOrDirtyGitRepo: mocks.confirmContinueIfNoOrDirtyGitRepo,\n printWelcome: mocks.printWelcome,\n}));\n\nvi.mock('../../../src/apple/lookup-xcode-project', () => ({\n lookupXcodeProject: mocks.lookupXcodeProject,\n selectXcodeTarget: async (\n xcodeProject: { getAllTargets: () => string[] },\n options: {\n targetNames?: string[];\n promptMessage?: string;\n } = {},\n ): Promise<string> => {\n const targetNames = options.targetNames ?? xcodeProject.getAllTargets();\n if (targetNames.length === 1) {\n return targetNames[0];\n }\n\n const askForItemSelection = mocks.askForItemSelection as (\n items: string[],\n message: string,\n ) => Promise<{ value: string }>;\n const selection = await askForItemSelection(\n targetNames,\n options.promptMessage ?? 'Which target do you want to add Sentry to?',\n );\n return selection.value;\n },\n}));\n\nvi.mock('../../../src/apple/snapshots/snapshot-test-file', () => ({\n ensureSnapshotTestFile: mocks.ensureSnapshotTestFile,\n snapshotTestClassName: (hostedTestTargetName: string): string =>\n `${hostedTestTargetName}SnapshotTest`,\n snapshotTestTemplate: (className: string): string => `import SnapshottingTests\n\nfinal class ${className}: SnapshotTest {\n override class func snapshotPreviews() -> [String]? { nil }\n override class func excludedSnapshotPreviews() -> [String]? { nil }\n override class func snapshotPreviewModules() -> [String]? { nil }\n override class func excludedSnapshotPreviewModules() -> [String]? { nil }\n}\n`,\n}));\n\nvi.mock(\n '../../../src/apple/snapshots/configure-snapshotpreviews-xcode-project',\n () => ({\n configureSnapshotPreviewsXcodeProject:\n mocks.configureSnapshotPreviewsXcodeProject,\n }),\n);\n\nvi.mock('../../../src/apple/snapshots/snapshots-cli-preflight', () => ({\n checkInstalledCLISnapshots: mocks.checkInstalledCLISnapshots,\n}));\n\nvi.mock('../../../src/apple/snapshots/snapshot-verification-scheme', () => ({\n resolveSnapshotVerificationSchemeName:\n mocks.resolveSnapshotVerificationSchemeName,\n}));\n\nimport { runAppleSnapshotsWizard } from '../../../src/apple/snapshots/apple-snapshots-wizard';\n\ndescribe('runAppleSnapshotsWizard', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n mocks.ensureSnapshotTestFile.mockReturnValue({\n changed: true,\n className: 'AppTestsSnapshotTest',\n filePath: '/tmp/AppTestsSnapshotTest.swift',\n included: true,\n });\n mocks.configureSnapshotPreviewsXcodeProject.mockReturnValue({\n changed: true,\n failedSnapshotPreferencesTargetNames: [],\n linked: true,\n });\n mocks.resolveSnapshotVerificationSchemeName.mockReturnValue('AppScheme');\n mocks.askForItemSelection.mockResolvedValue({ value: 'App' });\n mocks.confirm.mockResolvedValue(false);\n mocks.abort.mockRejectedValue(new Error('aborted'));\n });\n\n it('links SnapshotPreferences only to the selected app target', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const selectedPreviewFile = path.join(tempDir, 'SelectedView.swift');\n const otherPreviewFile = path.join(tempDir, 'OtherView.swift');\n fs.writeFileSync(\n selectedPreviewFile,\n '#Preview { SelectedView() }',\n 'utf8',\n );\n fs.writeFileSync(otherPreviewFile, '#Preview { OtherView() }', 'utf8');\n mocks.askForItemSelection.mockResolvedValue({ value: 'App' });\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn((targetName: string) =>\n targetName === 'App' ? [selectedPreviewFile] : [otherPreviewFile],\n ),\n getAllTargets: vi.fn(() => ['App', 'OtherApp']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n ]),\n getUnitTestTargetNames: vi.fn(() => ['AppTests']),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(mocks.askForItemSelection).toHaveBeenCalledWith(\n ['App', 'OtherApp'],\n 'Which app target should SnapshotPreviews use?',\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('prompts only among unit-test targets hosted by the selected app target', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const previewFile = path.join(tempDir, 'ContentView.swift');\n fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');\n mocks.askForItemSelection.mockResolvedValue({\n value: 'AppSnapshotTests',\n });\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [previewFile]),\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => [\n 'AppTests',\n 'AppSnapshotTests',\n ]),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n 'AppSnapshotTests',\n ]),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(\n xcodeProject.getHostedUnitTestTargetNamesForApplicationTarget,\n ).toHaveBeenCalledWith('App');\n expect(mocks.askForItemSelection).toHaveBeenCalledWith(\n ['AppTests', 'AppSnapshotTests'],\n 'Which test target should render SnapshotPreviews?',\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppSnapshotTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('links SnapshotPreferences to the selected app target without scanning for Swift previews', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const selectedFile = path.join(tempDir, 'SelectedView.swift');\n const otherPreviewFile = path.join(tempDir, 'OtherView.swift');\n fs.writeFileSync(selectedFile, 'struct SelectedView {}', 'utf8');\n fs.writeFileSync(otherPreviewFile, '#Preview { OtherView() }', 'utf8');\n mocks.askForItemSelection.mockResolvedValue({ value: 'App' });\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn((targetName: string) =>\n targetName === 'App' ? [selectedFile] : [otherPreviewFile],\n ),\n getAllTargets: vi.fn(() => ['App', 'OtherApp']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n ]),\n getUnitTestTargetNames: vi.fn(() => ['AppTests']),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(mocks.confirm).not.toHaveBeenCalled();\n expect(xcodeProject.getSourceFilesForTarget).not.toHaveBeenCalled();\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('warns when optional SnapshotPreferences linking fails', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const previewFile = path.join(tempDir, 'ContentView.swift');\n fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');\n mocks.configureSnapshotPreviewsXcodeProject.mockReturnValue({\n changed: true,\n failedSnapshotPreferencesTargetNames: ['App'],\n linked: true,\n });\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [previewFile]),\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n ]),\n getUnitTestTargetNames: vi.fn(() => ['AppTests']),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(mocks.warn).toHaveBeenCalledWith(\n expect.stringContaining('SnapshotPreferences could not be linked to App'),\n );\n expect(mocks.checkInstalledCLISnapshots).toHaveBeenCalledTimes(1);\n });\n\n it('links SnapshotPreferences in non-interactive mode without scanning for Swift previews', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const selectedFile = path.join(tempDir, 'SelectedView.swift');\n fs.writeFileSync(selectedFile, 'struct SelectedView {}', 'utf8');\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [selectedFile]),\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n ]),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: true,\n });\n\n expect(mocks.confirm).not.toHaveBeenCalled();\n expect(xcodeProject.getSourceFilesForTarget).not.toHaveBeenCalled();\n expect(mocks.info).not.toHaveBeenCalledWith(\n expect.stringContaining('Continuing without Swift previews'),\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('uses explicit app and hosted XCTest targets without prompting', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const previewFile = path.join(tempDir, 'ContentView.swift');\n fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [previewFile]),\n getAllTargets: vi.fn(() => ['App', 'OtherApp']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => []),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n appTarget: 'App',\n hostedTestTarget: 'AppTests',\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: true,\n });\n\n expect(mocks.askForItemSelection).not.toHaveBeenCalled();\n expect(mocks.confirmContinueIfNoOrDirtyGitRepo).toHaveBeenCalledWith({\n ignoreGitChanges: true,\n cwd: tempDir,\n nonInteractive: true,\n });\n expect(mocks.lookupXcodeProject).toHaveBeenCalledWith({\n projectDir: tempDir,\n nonInteractive: true,\n });\n expect(mocks.checkInstalledCLISnapshots).toHaveBeenCalledWith(\n expect.objectContaining({ nonInteractive: true }),\n );\n expect(\n xcodeProject.getHostedUnitTestTargetNamesForApplicationTarget,\n ).not.toHaveBeenCalled();\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('falls back to prompting among hosted XCTest targets when app-specific matching is inconclusive', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const previewFile = path.join(tempDir, 'ContentView.swift');\n fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');\n mocks.askForItemSelection.mockResolvedValue({\n value: 'AppSnapshotTests',\n });\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [previewFile]),\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => [\n 'AppTests',\n 'AppSnapshotTests',\n ]),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => []),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(mocks.warn).toHaveBeenCalledWith(\n expect.stringContaining('Could not automatically match'),\n );\n expect(mocks.askForItemSelection).toHaveBeenCalledWith(\n ['AppTests', 'AppSnapshotTests'],\n 'Which hosted XCTest target should render SnapshotPreviews?',\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppSnapshotTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('aborts when app target selection is ambiguous in non-interactive mode', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const xcodeProject = {\n getAllTargets: vi.fn(() => ['App', 'OtherApp']),\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await expect(\n runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: true,\n }),\n ).rejects.toThrow('aborted');\n\n expect(mocks.askForItemSelection).not.toHaveBeenCalled();\n expect(mocks.error).toHaveBeenCalledWith(\n expect.stringContaining('Pass --app-target <target-name>'),\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).not.toHaveBeenCalled();\n expect(mocks.abort).toHaveBeenCalledWith(\n 'Apple Snapshots setup did not complete.',\n );\n expect(mocks.outro).not.toHaveBeenCalledWith(\n 'Apple Snapshots setup did not complete.',\n );\n });\n\n it('aborts with manual instructions instead of prompting when hosted XCTest fallback is ambiguous in non-interactive mode', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const xcodeProject = {\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => [\n 'AppTests',\n 'AppSnapshotTests',\n ]),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => []),\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await expect(\n runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: true,\n }),\n ).rejects.toThrow('aborted');\n\n expect(mocks.askForItemSelection).not.toHaveBeenCalled();\n expect(mocks.error).toHaveBeenCalledWith(\n expect.stringContaining('Pass --hosted-test-target <target-name>'),\n );\n expect(mocks.error).toHaveBeenCalledWith(\n expect.stringContaining('Manual setup:'),\n );\n expect(mocks.error).toHaveBeenCalledWith(\n expect.stringContaining('import SnapshottingTests'),\n );\n expect(mocks.error).toHaveBeenCalledWith(\n expect.stringContaining('final class AppTestsSnapshotTest'),\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).not.toHaveBeenCalled();\n expect(mocks.abort).toHaveBeenCalledWith(\n 'Apple Snapshots setup did not complete.',\n );\n expect(mocks.outro).not.toHaveBeenCalledWith(\n 'Apple Snapshots setup did not complete.',\n );\n });\n\n it('wires the Apple Snapshots flow without Sentry auth/runtime/CI mutation', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const previewFile = path.join(tempDir, 'ContentView.swift');\n fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');\n fs.writeFileSync(path.join(tempDir, 'Package.swift'), '', 'utf8');\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [previewFile]),\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n ]),\n getUnitTestTargetNames: vi.fn(() => ['AppTests']),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(mocks.withTelemetry).toHaveBeenCalledWith(\n expect.objectContaining({ integration: 'appleSnapshots' }),\n expect.any(Function),\n );\n expect(mocks.printWelcome).toHaveBeenCalledWith({\n wizardName: 'Sentry Apple Snapshots Wizard',\n promoCode: 'CAM',\n });\n expect(mocks.confirmContinueIfNoOrDirtyGitRepo).toHaveBeenCalledWith({\n ignoreGitChanges: true,\n cwd: tempDir,\n nonInteractive: false,\n });\n expect(mocks.lookupXcodeProject).toHaveBeenCalledWith({\n projectDir: tempDir,\n nonInteractive: false,\n });\n expect(mocks.confirm).not.toHaveBeenCalled();\n expect(mocks.info).toHaveBeenCalledWith(\n expect.stringContaining('SnapshotPreferences in Swift preview files'),\n );\n expect(mocks.info).toHaveBeenCalledWith(\n expect.stringContaining('This wizard does not edit SwiftPM manifests'),\n );\n expect(mocks.ensureSnapshotTestFile).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n });\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n previewTargetNames: ['App'],\n });\n expect(mocks.write).toHaveBeenCalledTimes(1);\n expect(mocks.checkInstalledCLISnapshots).toHaveBeenCalledWith({\n projectDir: tempDir,\n nonInteractive: false,\n verificationGuidance: {\n appId: 'com.getsentry.App',\n hostedTestTargetName: 'AppTests',\n projectDir: tempDir,\n projectPath: path.join(tempDir, 'App.xcodeproj'),\n schemeName: 'AppScheme',\n snapshotTestClassName: 'AppTestsSnapshotTest',\n },\n });\n expect(mocks.outro).toHaveBeenCalledWith(\n expect.stringContaining('Apple Snapshots setup complete.'),\n );\n });\n});\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { XcodeProject } from '../../../src/apple/xcode-manager';
|
|
2
|
+
export type HostedTestTargetFixtureIds = {
|
|
3
|
+
targetId: string;
|
|
4
|
+
frameworksBuildPhaseId: string;
|
|
5
|
+
sourcesBuildPhaseId?: string;
|
|
6
|
+
debugBuildConfigurationId: string;
|
|
7
|
+
releaseBuildConfigurationId: string;
|
|
8
|
+
buildConfigurationListId: string;
|
|
9
|
+
productReferenceId: string;
|
|
10
|
+
};
|
|
11
|
+
type HostedTestTargetFixtureOptions = {
|
|
12
|
+
name?: string;
|
|
13
|
+
hostAppName?: string;
|
|
14
|
+
testHost?: string;
|
|
15
|
+
bundleLoader?: string;
|
|
16
|
+
ids?: HostedTestTargetFixtureIds;
|
|
17
|
+
includeSourcesBuildPhase?: boolean;
|
|
18
|
+
projectObjectId: string;
|
|
19
|
+
productsGroupId: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function copySingleTargetProjectToTemp(prefix: string): string;
|
|
22
|
+
export declare function addHostedUnitTestTarget(xcodeProject: XcodeProject, options: HostedTestTargetFixtureOptions): HostedTestTargetFixtureIds;
|
|
23
|
+
export declare function hostedTestTargetFixtureIds(name: string): HostedTestTargetFixtureIds;
|
|
24
|
+
export {};
|