addons/isl-server/src/__tests__/GeneratedFiles.test.tsblame
View source
b69ab311/**
b69ab312 * Copyright (c) Meta Platforms, Inc. and affiliates.
b69ab313 *
b69ab314 * This source code is licensed under the MIT license found in the
b69ab315 * LICENSE file in the root directory of this source tree.
b69ab316 */
b69ab317
b69ab318import type {PathLike} from 'node:fs';
b69ab319import type {FileHandle} from 'node:fs/promises';
b69ab3110import type {Repository} from '../Repository';
b69ab3111import type {ServerPlatform} from '../serverPlatform';
b69ab3112import type {RepositoryContext} from '../serverTypes';
b69ab3113
b69ab3114import {GeneratedStatus} from 'isl/src/types';
b69ab3115import {promises} from 'node:fs';
b69ab3116import {mockLogger} from 'shared/testUtils';
b69ab3117import {GeneratedFilesDetector} from '../GeneratedFiles';
b69ab3118import {makeServerSideTracker} from '../analytics/serverSideTracker';
b69ab3119
b69ab3120/* eslint-disable require-await */
b69ab3121
b69ab3122const mockTracker = makeServerSideTracker(
b69ab3123 mockLogger,
b69ab3124 {platformName: 'test'} as ServerPlatform,
b69ab3125 '0.1',
b69ab3126 jest.fn(),
b69ab3127);
b69ab3128
b69ab3129const mockCtx: RepositoryContext = {
b69ab3130 cwd: 'cwd',
b69ab3131 cmd: 'sl',
b69ab3132 logger: mockLogger,
b69ab3133 tracker: mockTracker,
b69ab3134};
b69ab3135
b69ab3136describe('GeneratedFiles', () => {
b69ab3137 describe('getGeneratedFilePathRegex', () => {
b69ab3138 it('can take configured custom regex', async () => {
b69ab3139 jest.spyOn(promises, 'open').mockImplementation(async () => {
b69ab3140 throw new Error('skipping in tests');
b69ab3141 });
b69ab3142
b69ab3143 const mockRepo = {
b69ab3144 getConfig: async () => Promise.resolve('foobar'),
b69ab3145 logger: mockLogger,
b69ab3146 } as unknown as Repository;
b69ab3147 const detector = new GeneratedFilesDetector();
b69ab3148 const result = await detector.queryFilesGenerated(mockRepo, mockCtx, '/', [
b69ab3149 'src/myFile.js',
b69ab3150 'foobar',
b69ab3151 ]);
b69ab3152 expect(result).toEqual({
b69ab3153 'src/myFile.js': GeneratedStatus.Manual,
b69ab3154 foobar: GeneratedStatus.Generated,
b69ab3155 });
b69ab3156 });
b69ab3157
b69ab3158 it('detects yarn.lock as generated', async () => {
b69ab3159 jest.spyOn(promises, 'open').mockImplementation(async () => {
b69ab3160 throw new Error('skipping in tests');
b69ab3161 });
b69ab3162
b69ab3163 const mockRepo = {
b69ab3164 getConfig: async () => Promise.resolve(undefined),
b69ab3165 logger: mockLogger,
b69ab3166 } as unknown as Repository;
b69ab3167 const detector = new GeneratedFilesDetector();
b69ab3168 const result = await detector.queryFilesGenerated(mockRepo, mockCtx, '/', [
b69ab3169 'src/myFile.js',
b69ab3170 'yarn.lock',
b69ab3171 'subproject/yarn.lock',
b69ab3172 ]);
b69ab3173 expect(result).toEqual({
b69ab3174 'src/myFile.js': GeneratedStatus.Manual,
b69ab3175 'yarn.lock': GeneratedStatus.Generated,
b69ab3176 'subproject/yarn.lock': GeneratedStatus.Generated,
b69ab3177 });
b69ab3178 });
b69ab3179 });
b69ab3180
b69ab3181 describe('readFilesLookingForGeneratedTag', () => {
b69ab3182 it('detects generate tag in file content', async () => {
b69ab3183 jest.spyOn(promises, 'open').mockImplementation(async (filePath: PathLike, _flags, _mod) => {
b69ab3184 return {
b69ab3185 read: jest.fn(async () => ({
b69ab3186 buffer:
b69ab3187 filePath === '/myGeneratedFile.js'
b69ab3188 ? `/* this file is ${'@'}generated */`
b69ab3189 : filePath === '/myPartiallyGeneratedFile.js'
b69ab3190 ? `/* this file is ${'@'}partially-generated */`
b69ab3191 : '// Normal file content',
b69ab3192 })),
b69ab3193 close: jest.fn(),
b69ab3194 } as unknown as FileHandle;
b69ab3195 });
b69ab3196
b69ab3197 const mockRepo = {
b69ab3198 getConfig: async () => Promise.resolve(undefined),
b69ab3199 logger: mockLogger,
b69ab31100 } as unknown as Repository;
b69ab31101 const detector = new GeneratedFilesDetector();
b69ab31102 const result = await detector.queryFilesGenerated(mockRepo, mockCtx, '/', [
b69ab31103 'myFile.js',
b69ab31104 'myPartiallyGeneratedFile.js',
b69ab31105 'myGeneratedFile.js',
b69ab31106 ]);
b69ab31107 expect(result).toEqual({
b69ab31108 'myFile.js': GeneratedStatus.Manual,
b69ab31109 'myPartiallyGeneratedFile.js': GeneratedStatus.PartiallyGenerated,
b69ab31110 'myGeneratedFile.js': GeneratedStatus.Generated,
b69ab31111 });
b69ab31112 });
b69ab31113 });
b69ab31114});