import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing';
import * as LANG from '../core/lang.config';
import { APPNAME, createOhayoApp, createOhayoRunner, createNgRunner } from '../utils/testing';

describe('NgOhayoSchematic: application', () => {
  let runner: SchematicTestRunner;
  let tree: UnitTestTree;

  describe(``, () => {
    beforeEach(async () => ({ runner, tree } = await createOhayoApp()));
    it(`should add @ohayo to dependencies`, () => {
      const packageJson = JSON.parse(tree.readContent('package.json'));
      expect(packageJson.dependencies['@ohayo/theme']).toBeDefined();
      expect(packageJson.dependencies['@ohayo/components']).toBeDefined();
      expect(packageJson.dependencies['@ohayo/util']).toBeDefined();
      expect(packageJson.dependencies['@ohayo/acl']).toBeDefined();
      expect(packageJson.dependencies['@ohayo/auth']).toBeDefined();
      expect(packageJson.dependencies['@ohayo/cache']).toBeDefined();
      expect(packageJson.dependencies['@ohayo/mock']).toBeDefined();
    });
    it('should be add vscode extensions confir', () => {
      const filePath = '.vscode/extensions.json';
      expect(tree.exists(filePath)).toBe(true, `Not found [${filePath}]`);
      const json = JSON.parse(tree.readContent(filePath));
      expect(json != null).toBe(true);
      expect(json.recommendations[0]).toBe('cipchk.ohayojp-extension-pack');
    });
  });

  describe('#i18n', () => {
    describe('with true', () => {
      beforeEach(async () => ({ runner, tree } = await createOhayoApp({ i18n: true })));
      it(`can add i18n related`, () => {
        const specTs = tree.readContent('/projects/foo/src/app/app.module.ts');
        expect(specTs).toContain(`import { I18NService } from '@core'`);
      });
    });
    describe('with false', () => {
      beforeEach(async () => ({ runner, tree } = await createOhayoApp({ i18n: false })));
      it(`can't add i18n related`, () => {
        const specTs = tree.readContent('/projects/foo/src/app/app.module.ts');
        expect(specTs).not.toContain(`@core/i18n/`);
      });
    });
    describe('default language', () => {
      it(`with use zh`, async () => {
        spyOn(LANG, 'getLangData').and.returnValue(
          JSON.stringify({
            key1: 'Key1',
            key2: 'KEY2',
          }),
        );
        const baseRunner = createNgRunner();
        const workspaceTree = await baseRunner
          .runSchematicAsync('workspace', {
            name: 'workspace',
            newProjectRoot: 'projects',
            version: '6.0.0',
          })
          .toPromise();
        const appTree = await baseRunner
          .runSchematicAsync(
            'application',
            {
              name: APPNAME,
              inlineStyle: false,
              inlineTemplate: false,
              routing: false,
              style: 'css',
              skipTests: false,
              skipPackageJson: false,
            },
            workspaceTree,
          )
          .toPromise();
        appTree.create(
          '/demo.html',
          `
        {{(status ? 'key1' : 'key2') | translate }}
        {{ (status ? 'menu.fullscreen.exit' : 'menu.fullscreen') | translate }}
        [placeholder]="'key1' | translate">
        <nz-tab [nzTitle]="'key1' | translate">
        {{ 'Please enter mobile number!' | translate }}
        <button>{{ count ? count + 's' : 'key1' | translate }}</button>
        `,
        );

        const ohayoRunner = createOhayoRunner();
        // tslint:disable-next-line:no-shadowed-variable
        const tree = await ohayoRunner
          .runSchematicAsync(
            'ng-add',
            {
              skipPackageJson: false,
              defaultLanguage: 'zh',
            },
            appTree,
          )
          .toPromise();

        const res = tree.readContent('/demo.html');
        expect(res).toBe(`
        {{ status ? 'key1' : 'key2' }}
        {{ status ? 'menu.fullscreen.exit' : 'menu.fullscreen' }}
        [placeholder]="'key1'">
        <nz-tab [nzTitle]="'key1'">
        Please enter mobile number!
        <button>{{ count ? count + 's' : 'key1'}}</button>
        `);
      });
    });
  });
});
