apify-test-tools 0.6.3 → 0.6.4-beta.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/package.json CHANGED
@@ -1,63 +1,63 @@
1
1
  {
2
- "name": "apify-test-tools",
3
- "version": "0.6.3",
4
- "type": "module",
5
- "description": "TBD",
6
- "repository": {
7
- "type": "git",
8
- "url": "https://github.com/apify/apify-test-tools.git"
9
- },
10
- "engines": {
11
- "node": ">=18.0.0"
12
- },
13
- "bin": {
14
- "apify-test-tools": "dist/bin/main.js"
15
- },
16
- "types": "./dist/index.d.ts",
17
- "main": "./dist/lib/lib.js",
18
- "dependencies": {
19
- "@apify/consts": "^2.43.0",
20
- "@slack/web-api": "^7.9.2",
21
- "apify-client": "^2.22.2",
22
- "yargs": "^18.0.0"
23
- },
24
- "devDependencies": {
25
- "@apify/eslint-config": "^1.0.0",
26
- "@apify/tsconfig": "^0.1.1",
27
- "@types/node": "^24.0.0",
28
- "@types/yargs": "^17.0.33",
29
- "eslint": "^9.29.0",
30
- "eslint-config-prettier": "^10.1.5",
31
- "globals": "^17.0.0",
32
- "prettier": "^3.5.3",
33
- "tsx": "^4.20.3",
34
- "typescript": "^5.9.3",
35
- "typescript-eslint": "^8.34.1",
36
- "vitest": "^3.2.4",
37
- "knip": "^5.65.0",
38
- "husky": "^9.0.11",
39
- "lint-staged": "^15.2.2"
40
- },
41
- "peerDependencies": {
42
- "vitest": ">=3.2.4"
43
- },
44
- "scripts": {
45
- "start": "npm run dist/bin/main.js",
46
- "start:dev": "GITHUB_WORKSPACE=local-clone tsx bin/main.ts",
47
- "build": "tsc && chmod +x ./dist/bin/main.js",
48
- "lint": "eslint",
49
- "lint:fix": "eslint --fix",
50
- "format": "prettier --write .",
51
- "format:check": "prettier --check .",
52
- "type-check": "tsc --noEmit",
53
- "test": "vitest run",
54
- "check-unused": "npx knip",
55
- "prepare": "husky .husky || true"
56
- },
57
- "lint-staged": {
58
- "*.js": "eslint",
59
- "*.ts": "eslint"
60
- },
61
- "author": "oklinov",
62
- "license": "ISC"
2
+ "name": "apify-test-tools",
3
+ "version": "0.6.4-beta.0",
4
+ "type": "module",
5
+ "description": "TBD",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/apify/apify-test-tools.git"
9
+ },
10
+ "engines": {
11
+ "node": ">=18.0.0"
12
+ },
13
+ "bin": {
14
+ "apify-test-tools": "dist/bin/main.js"
15
+ },
16
+ "types": "./dist/index.d.ts",
17
+ "main": "./dist/lib/lib.js",
18
+ "dependencies": {
19
+ "@apify/consts": "^2.43.0",
20
+ "@slack/web-api": "^7.9.2",
21
+ "apify-client": "^2.22.2",
22
+ "yargs": "^18.0.0"
23
+ },
24
+ "devDependencies": {
25
+ "@apify/eslint-config": "^1.0.0",
26
+ "@apify/tsconfig": "^0.1.1",
27
+ "@types/node": "^24.0.0",
28
+ "@types/yargs": "^17.0.33",
29
+ "eslint": "^9.29.0",
30
+ "eslint-config-prettier": "^10.1.5",
31
+ "globals": "^17.0.0",
32
+ "prettier": "^3.5.3",
33
+ "tsx": "^4.20.3",
34
+ "typescript": "^5.9.3",
35
+ "typescript-eslint": "^8.34.1",
36
+ "vitest": "^3.2.4",
37
+ "knip": "^5.65.0",
38
+ "husky": "^9.0.11",
39
+ "lint-staged": "^15.2.2"
40
+ },
41
+ "peerDependencies": {
42
+ "vitest": ">=3.2.4"
43
+ },
44
+ "scripts": {
45
+ "start": "npm run dist/bin/main.js",
46
+ "start:dev": "GITHUB_WORKSPACE=local-clone tsx bin/main.ts",
47
+ "build": "tsc && chmod +x ./dist/bin/main.js",
48
+ "lint": "eslint",
49
+ "lint:fix": "eslint --fix",
50
+ "format": "prettier --write .",
51
+ "format:check": "prettier --check .",
52
+ "type-check": "tsc --noEmit",
53
+ "test": "vitest run",
54
+ "check-unused": "npx knip",
55
+ "prepare": "husky .husky || true"
56
+ },
57
+ "lint-staged": {
58
+ "*.js": "eslint",
59
+ "*.ts": "eslint"
60
+ },
61
+ "author": "oklinov",
62
+ "license": "ISC"
63
63
  }
@@ -1,7 +1,13 @@
1
1
  import type { MockInstance } from 'vitest';
2
2
  import { beforeEach, describe, expect, it, vi } from 'vitest';
3
3
 
4
- import { getChangedFiles, getCommits, parseBaseCommit } from '../../../bin/git.js';
4
+ import {
5
+ getBranchOnlyChangedFiles,
6
+ getChangedFiles,
7
+ getCommits,
8
+ hasMergeFromTarget,
9
+ parseBaseCommit,
10
+ } from '../../../bin/git.js';
5
11
  import * as Utils from '../../../bin/utils.js';
6
12
 
7
13
  describe('getCommits', () => {
@@ -117,6 +123,86 @@ describe('getChangedFiles', () => {
117
123
  });
118
124
  });
119
125
 
126
+ describe('hasMergeFromTarget', () => {
127
+ const sourceBranch = 'feature-branch';
128
+ const targetBranch = 'main';
129
+ const mergeSha = 'f'.repeat(40);
130
+ const branchParentSha = 'b'.repeat(40);
131
+ const targetParentSha = 't'.repeat(40);
132
+
133
+ let gitCommandSpy: MockInstance;
134
+
135
+ beforeEach(() => {
136
+ gitCommandSpy = vi.spyOn(Utils, 'spawnCommandInGhWorkspace');
137
+ });
138
+
139
+ it('should return false when there are no merge commits on the branch', () => {
140
+ gitCommandSpy.mockImplementation((cmd: string) => {
141
+ if (cmd.includes('--merges')) return '';
142
+ return '';
143
+ });
144
+
145
+ expect(hasMergeFromTarget(sourceBranch, targetBranch)).toBe(false);
146
+ expect(gitCommandSpy).toHaveBeenCalledWith(
147
+ `git log --merges --pretty=format:%H ${targetBranch}..${sourceBranch}`,
148
+ );
149
+ });
150
+
151
+ it('should return true when a merge commit has a parent reachable from targetBranch', () => {
152
+ gitCommandSpy.mockImplementation((cmd: string) => {
153
+ if (cmd.includes('--merges')) return mergeSha;
154
+ if (cmd.includes('--pretty=format:%P')) return `${branchParentSha} ${targetParentSha}`;
155
+ if (cmd.startsWith(`git merge-base ${branchParentSha}`)) return branchParentSha; // not ancestor
156
+ if (cmd.startsWith(`git merge-base ${targetParentSha}`)) return targetParentSha; // is ancestor
157
+ return '';
158
+ });
159
+
160
+ expect(hasMergeFromTarget(sourceBranch, targetBranch)).toBe(true);
161
+ });
162
+
163
+ it('should return false when the merge commit parent is not reachable from targetBranch (unrelated branch merge)', () => {
164
+ const unrelatedSha = 'e'.repeat(40);
165
+ const differentMergeBase = '0'.repeat(40);
166
+ gitCommandSpy.mockImplementation((cmd: string) => {
167
+ if (cmd.includes('--merges')) return mergeSha;
168
+ if (cmd.includes('--pretty=format:%P')) return `${branchParentSha} ${unrelatedSha}`;
169
+ // merge-base returns something other than the parent — not an ancestor
170
+ if (cmd.startsWith('git merge-base')) return differentMergeBase;
171
+ return '';
172
+ });
173
+
174
+ expect(hasMergeFromTarget(sourceBranch, targetBranch)).toBe(false);
175
+ });
176
+ });
177
+
178
+ describe('getBranchOnlyChangedFiles', () => {
179
+ const sourceBranch = 'feature-branch';
180
+ const targetBranch = 'main';
181
+
182
+ let gitCommandSpy: MockInstance;
183
+
184
+ beforeEach(() => {
185
+ gitCommandSpy = vi.spyOn(Utils, 'spawnCommandInGhWorkspace');
186
+ });
187
+
188
+ it('should return files touched by non-merge commits', () => {
189
+ gitCommandSpy.mockReturnValue('README.md\n\nactors/foo_bar/src/main.ts\n');
190
+
191
+ const result = getBranchOnlyChangedFiles(sourceBranch, targetBranch);
192
+
193
+ expect(result).toStrictEqual(['README.md', 'actors/foo_bar/src/main.ts']);
194
+ expect(gitCommandSpy).toHaveBeenCalledWith(
195
+ `git log --no-merges --name-only --pretty=format: ${targetBranch}..${sourceBranch}`,
196
+ );
197
+ });
198
+
199
+ it('should return empty array when there are no non-merge commits', () => {
200
+ gitCommandSpy.mockReturnValue('');
201
+
202
+ expect(getBranchOnlyChangedFiles(sourceBranch, targetBranch)).toStrictEqual([]);
203
+ });
204
+ });
205
+
120
206
  const VALID_SHA = 'a'.repeat(40);
121
207
  const VALID_JSON = JSON.stringify({ sha: VALID_SHA, author: 'test', date: 'now', message: 'msg' });
122
208