1import { vol } from 'memfs';
2import path from 'path';
3
4import { findPnpmWorkspaceRoot, PNPM_WORKSPACE_FILE } from '../nodeWorkspaces';
5
6jest.mock('@expo/spawn-async');
7jest.mock('fs');
8jest.mock('path', () => jest.requireActual('path').posix); // Make tests run on Windows
9
10describe(findPnpmWorkspaceRoot, () => {
11  const workspaceRoot = '/monorepo';
12  const projectRoot = '/monorepo/packages/test';
13
14  afterEach(() => vol.reset());
15
16  it('resolves root from project', () => {
17    vol.fromJSON(
18      {
19        'package.json': JSON.stringify({ private: true, name: '@acme/monorepo' }),
20        [PNPM_WORKSPACE_FILE]: 'packages:\n  - packages/*',
21        [path.join(projectRoot, 'package.json')]: JSON.stringify({ name: '@acme/test' }),
22      },
23      workspaceRoot
24    );
25
26    expect(findPnpmWorkspaceRoot(projectRoot)).toBe(workspaceRoot);
27  });
28
29  it('resolves root from workspace', () => {
30    vol.fromJSON(
31      {
32        'package.json': JSON.stringify({ private: true, name: '@acme/monorepo' }),
33        [PNPM_WORKSPACE_FILE]: 'packages:\n  - packages/*',
34        [path.join(projectRoot, 'package.json')]: JSON.stringify({ name: '@acme/test' }),
35      },
36      workspaceRoot
37    );
38
39    expect(findPnpmWorkspaceRoot(workspaceRoot)).toBe(workspaceRoot);
40  });
41
42  it('ignores root from uncoupled project', () => {
43    vol.fromJSON(
44      {
45        'package.json': JSON.stringify({ private: true, name: '@acme/monorepo' }),
46        [PNPM_WORKSPACE_FILE]: 'packages:\n  - packages-not-included/*',
47        [path.join(projectRoot, 'package.json')]: JSON.stringify({ name: '@acme/test' }),
48      },
49      workspaceRoot
50    );
51
52    expect(findPnpmWorkspaceRoot(projectRoot)).toBeNull();
53  });
54});
55