1// Copyright 2024 The Pigweed Authors 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); you may not 4// use this file except in compliance with the License. You may obtain a copy of 5// the License at 6// 7// https://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12// License for the specific language governing permissions and limitations under 13// the License. 14 15import { writeFileSync, mkdirSync } from 'fs'; 16import { join } from 'path'; 17 18import { 19 findPigweedJsonAbove, 20 findPigweedJsonBelow, 21 inferPigweedProjectRoot, 22} from './project'; 23 24import { makeTempDir } from './testUtils'; 25 26describe('find pigweed.json', () => { 27 test('find pigweed.json 1 level above', async () => { 28 const dir = await makeTempDir(); 29 writeFileSync(join(dir, 'pigweed.json'), ''); 30 const nestedDir = join(dir, 'nested'); 31 mkdirSync(nestedDir); 32 const projectRoot = findPigweedJsonAbove(nestedDir); 33 expect(projectRoot).toBe(dir); 34 }); 35 36 test('find pigweed.json 2 levels above', async () => { 37 const dir = await makeTempDir(); 38 writeFileSync(join(dir, 'pigweed.json'), ''); 39 const nestedDir = join(dir, 'nested'); 40 mkdirSync(nestedDir); 41 const nestedDir2 = join(dir, 'nested', 'again'); 42 mkdirSync(nestedDir2); 43 const projectRoot = findPigweedJsonAbove(nestedDir2); 44 expect(projectRoot).toBe(dir); 45 }); 46 47 test('find pigweed.json 1 level below', async () => { 48 const dir = await makeTempDir(); 49 const nestedDir = join(dir, 'nested'); 50 mkdirSync(nestedDir); 51 writeFileSync(join(nestedDir, 'pigweed.json'), ''); 52 const projectRoot = await findPigweedJsonBelow(dir); 53 expect(projectRoot[0]).toBe(nestedDir); 54 }); 55 56 test('find pigweed.json 2 levels below', async () => { 57 const dir = await makeTempDir(); 58 const nestedDir = join(dir, 'nested'); 59 mkdirSync(nestedDir); 60 const nestedDir2 = join(dir, 'nested', 'again'); 61 mkdirSync(nestedDir2); 62 writeFileSync(join(nestedDir2, 'pigweed.json'), ''); 63 const projectRoot = await findPigweedJsonBelow(dir); 64 expect(projectRoot[0]).toBe(nestedDir2); 65 }); 66 67 test('find pigweed.json below returns all found', async () => { 68 const dir = await makeTempDir(); 69 const nestedDir = join(dir, 'nested'); 70 mkdirSync(nestedDir); 71 writeFileSync(join(nestedDir, 'pigweed.json'), ''); 72 const nestedDir2 = join(dir, 'nested', 'again'); 73 mkdirSync(nestedDir2); 74 writeFileSync(join(nestedDir2, 'pigweed.json'), ''); 75 const projectRoot = await findPigweedJsonBelow(dir); 76 expect(projectRoot.length).toBe(2); 77 expect(projectRoot).toContain(nestedDir); 78 expect(projectRoot).toContain(nestedDir2); 79 }); 80 81 test('pigweed.json from above is preferred over below', async () => { 82 const dir = await makeTempDir(); 83 writeFileSync(join(dir, 'pigweed.json'), ''); 84 85 const workspaceDir = join(dir, 'workspace'); 86 mkdirSync(workspaceDir); 87 88 const pigweedDir = join(workspaceDir, 'pigweed'); 89 mkdirSync(pigweedDir); 90 writeFileSync(join(pigweedDir, 'pigweed.json'), ''); 91 92 const projectRoot = await inferPigweedProjectRoot(dir); 93 expect(projectRoot).toBe(dir); 94 }); 95}); 96