3.7 KB115 lines
Blame
1/**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8import type {PathLike} from 'node:fs';
9import type {FileHandle} from 'node:fs/promises';
10import type {Repository} from '../Repository';
11import type {ServerPlatform} from '../serverPlatform';
12import type {RepositoryContext} from '../serverTypes';
13
14import {GeneratedStatus} from 'isl/src/types';
15import {promises} from 'node:fs';
16import {mockLogger} from 'shared/testUtils';
17import {GeneratedFilesDetector} from '../GeneratedFiles';
18import {makeServerSideTracker} from '../analytics/serverSideTracker';
19
20/* eslint-disable require-await */
21
22const mockTracker = makeServerSideTracker(
23 mockLogger,
24 {platformName: 'test'} as ServerPlatform,
25 '0.1',
26 jest.fn(),
27);
28
29const mockCtx: RepositoryContext = {
30 cwd: 'cwd',
31 cmd: 'sl',
32 logger: mockLogger,
33 tracker: mockTracker,
34};
35
36describe('GeneratedFiles', () => {
37 describe('getGeneratedFilePathRegex', () => {
38 it('can take configured custom regex', async () => {
39 jest.spyOn(promises, 'open').mockImplementation(async () => {
40 throw new Error('skipping in tests');
41 });
42
43 const mockRepo = {
44 getConfig: async () => Promise.resolve('foobar'),
45 logger: mockLogger,
46 } as unknown as Repository;
47 const detector = new GeneratedFilesDetector();
48 const result = await detector.queryFilesGenerated(mockRepo, mockCtx, '/', [
49 'src/myFile.js',
50 'foobar',
51 ]);
52 expect(result).toEqual({
53 'src/myFile.js': GeneratedStatus.Manual,
54 foobar: GeneratedStatus.Generated,
55 });
56 });
57
58 it('detects yarn.lock as generated', async () => {
59 jest.spyOn(promises, 'open').mockImplementation(async () => {
60 throw new Error('skipping in tests');
61 });
62
63 const mockRepo = {
64 getConfig: async () => Promise.resolve(undefined),
65 logger: mockLogger,
66 } as unknown as Repository;
67 const detector = new GeneratedFilesDetector();
68 const result = await detector.queryFilesGenerated(mockRepo, mockCtx, '/', [
69 'src/myFile.js',
70 'yarn.lock',
71 'subproject/yarn.lock',
72 ]);
73 expect(result).toEqual({
74 'src/myFile.js': GeneratedStatus.Manual,
75 'yarn.lock': GeneratedStatus.Generated,
76 'subproject/yarn.lock': GeneratedStatus.Generated,
77 });
78 });
79 });
80
81 describe('readFilesLookingForGeneratedTag', () => {
82 it('detects generate tag in file content', async () => {
83 jest.spyOn(promises, 'open').mockImplementation(async (filePath: PathLike, _flags, _mod) => {
84 return {
85 read: jest.fn(async () => ({
86 buffer:
87 filePath === '/myGeneratedFile.js'
88 ? `/* this file is ${'@'}generated */`
89 : filePath === '/myPartiallyGeneratedFile.js'
90 ? `/* this file is ${'@'}partially-generated */`
91 : '// Normal file content',
92 })),
93 close: jest.fn(),
94 } as unknown as FileHandle;
95 });
96
97 const mockRepo = {
98 getConfig: async () => Promise.resolve(undefined),
99 logger: mockLogger,
100 } as unknown as Repository;
101 const detector = new GeneratedFilesDetector();
102 const result = await detector.queryFilesGenerated(mockRepo, mockCtx, '/', [
103 'myFile.js',
104 'myPartiallyGeneratedFile.js',
105 'myGeneratedFile.js',
106 ]);
107 expect(result).toEqual({
108 'myFile.js': GeneratedStatus.Manual,
109 'myPartiallyGeneratedFile.js': GeneratedStatus.PartiallyGenerated,
110 'myGeneratedFile.js': GeneratedStatus.Generated,
111 });
112 });
113 });
114});
115