/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
import { schema } from '@angular-devkit/core';
import { readFileSync } from 'fs';
import { join } from 'path';
import { CommandJsonPathException, parseJsonSchemaToCommandDescription } from './json-schema';

describe('parseJsonSchemaToCommandDescription', () => {
  let registry: schema.CoreSchemaRegistry;
  const baseSchemaJson = {
    '$schema': 'http://json-schema.org/schema',
    '$id': 'ng-cli://commands/version.json',
    'description': 'Outputs Angular CLI version.',
    '$longDescription': 'not a file ref',

    '$aliases': ['v'],
    '$scope': 'all',
    '$impl': './version-impl#VersionCommand',

    'type': 'object',
    'allOf': [
      { '$ref': './definitions.json#/definitions/base' },
    ],
  };

  beforeEach(() => {
    registry = new schema.CoreSchemaRegistry([]);
    registry.registerUriHandler((uri: string) => {
      if (uri.startsWith('ng-cli://')) {
        const content = readFileSync(
          join(__dirname, '..', uri.substr('ng-cli://'.length)), 'utf-8');

        return Promise.resolve(JSON.parse(content));
      } else {
        return null;
      }
    });
  });

  it(`should throw on invalid $longDescription path`, async () => {
    const name = 'version';
    const schemaPath = join(__dirname, './bad-sample.json');
    const schemaJson = { ...baseSchemaJson, $longDescription: 'not a file ref' };
    try {
      await parseJsonSchemaToCommandDescription(name, schemaPath, registry, schemaJson);
    } catch (error) {
      const refPath = join(__dirname, schemaJson.$longDescription);
      expect(error).toEqual(new CommandJsonPathException(refPath, name));

      return;
    }
    expect(true).toBe(false, 'function should have thrown');
  });

  it(`should throw on invalid $usageNotes path`, async () => {
    const name = 'version';
    const schemaPath = join(__dirname, './bad-sample.json');
    const schemaJson = { ...baseSchemaJson, $usageNotes: 'not a file ref' };
    try {
      await parseJsonSchemaToCommandDescription(name, schemaPath, registry, schemaJson);
    } catch (error) {
      const refPath = join(__dirname, schemaJson.$usageNotes);
      expect(error).toEqual(new CommandJsonPathException(refPath, name));

      return;
    }
    expect(true).toBe(false, 'function should have thrown');
  });
});
