File size: 1,608 Bytes
7a1ad33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
 * @license
 * Copyright 2025 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

import { describe, expect, it, vi } from 'vitest';
import { readFile } from 'node:fs/promises';
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';
import { main as generateSchema } from '../generate-settings-schema.ts';

vi.mock('fs', () => ({
  readFileSync: vi.fn().mockReturnValue(''),
  writeFileSync: vi.fn(),
  createWriteStream: vi.fn(() => ({
    write: vi.fn(),
    on: vi.fn(),
  })),
}));

describe('generate-settings-schema', () => {
  it('keeps schema in sync in check mode', async () => {
    const previousExitCode = process.exitCode;
    await expect(generateSchema(['--check'])).resolves.toBeUndefined();
    expect(process.exitCode).toBe(previousExitCode);
  });

  it('includes $schema property in generated schema', async () => {
    const __dirname = dirname(fileURLToPath(import.meta.url));
    const schemaPath = join(__dirname, '../../schemas/settings.schema.json');
    const schemaContent = await readFile(schemaPath, 'utf-8');
    const schema = JSON.parse(schemaContent);

    // Verify $schema property exists in the schema's properties
    expect(schema.properties).toHaveProperty('$schema');
    expect(schema.properties.$schema).toEqual({
      type: 'string',
      title: 'Schema',
      description:
        'The URL of the JSON schema for this settings file. Used by editors for validation and autocompletion.',
      default:
        'https://raw.githubusercontent.com/google-gemini/gemini-cli/main/schemas/settings.schema.json',
    });
  });
});