<commit_before>/**
 * @license
 * Copyright Google Inc. 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 {Generator} from '../src/generator';
import {MockFilesystem} from '../testing/mock';

describe('Generator', () => {
  beforeEach(() => spyOn(Date, 'now').and.returnValue(1234567890123));

  it('generates a correct config', done => {
    const fs = new MockFilesystem({
      '/index.html': 'This is a test',
      '/main.css': 'This is a CSS file',
      '/main.js': 'This is a JS file',
      '/main.ts': 'This is a TS file',
      '/test.txt': 'Another test',
      '/foo/test.html': 'Another test',
      '/ignored/x.html': 'should be ignored',
    });
    const gen = new Generator(fs, '/test');
    const res = gen.process({
      appData: {
        test: true,
      },
      index: '/index.html',
      assetGroups: [{
        name: 'test',
        resources: {
          files: [
            '/**/*.html',
            '/**/*.?s',
            '!/ignored/**',
            '/**/*.txt',
          ],
          urls: [
            '/absolute/**',
            '/some/url?with+escaped+chars',
            'relative/*.txt',
          ]
        }
      }],
      dataGroups: [{
        name: 'other',
        urls: [
          '/api/**',
          'relapi/**',
          'https://example.com/**/*?with+escaped+chars',
        ],
        cacheConfig: {
          maxSize: 100,
          maxAge: '3d',
          timeout: '1m',
        }
      }],
      navigationUrls: [
        '/included/absolute/**',
        '!/excluded/absolute/**',
        '/included/some/url/with+escaped+chars',
        '!excluded/relative/*.txt',
        '!/api/?*',
        'http://example.com/included',
        '!http://example.com/excluded',
      ],
    });
    res.then(config => {
         expect(config).toEqual({
           configVersion: 1,
           timestamp: 1234567890123,
           appData: {
             test: true,
           },
           index: '/test/index.html',
           assetGroups: [{
             name: 'test',
             installMode: 'prefetch',
             updateMode: 'prefetch',
             urls: [
               '/test/foo/test.html',
               '/test/index.html',
               '/test/main.js',
               '/test/main.ts',
               '/test/test.txt',
             ],
             patterns: [
               '\\/absolute\\/.*',
               '\\/some\\/url\\?with\\+escaped\\+chars',
               '\\/test\\/relative\\/[^/]*\\.txt',
             ]
           }],
           dataGroups: [{
             name: 'other',
             patterns: [
               '\\/api\\/.*',
               '\\/test\\/relapi\\/.*',
               'https:\\/\\/example\\.com\\/(?:.+\\/)?[^/]*\\?with\\+escaped\\+chars',
             ],
             strategy: 'performance',
             maxSize: 100,
             maxAge: 259200000,
             timeoutMs: 60000,
             version: 1,
           }],
           navigationUrls: [
             {positive: true, regex: '^\\/included\\/absolute\\/.*$'},
             {positive: false, regex: '^\\/excluded\\/absolute\\/.*$'},
             {positive: true, regex: '^\\/included\\/some\\/url\\/with\\+escaped\\+chars$'},
             {positive: false, regex: '^\\/test\\/excluded\\/relative\\/[^/]*\\.txt$'},
             {positive: false, regex: '^\\/api\\/[^/][^/]*$'},
             {positive: true, regex: '^http:\\/\\/example\\.com\\/included$'},
             {positive: false, regex: '^http:\\/\\/example\\.com\\/excluded$'},
           ],
           hashTable: {
             '/test/foo/test.html': '18f6f8eb7b1c23d2bb61bff028b83d867a9e4643',
             '/test/index.html': 'a54d88e06612d820bc3be72877c74f257b561b19',
             '/test/main.js': '41347a66676cdc0516934c76d9d13010df420f2c',
             '/test/main.ts': '7d333e31f0bfc4f8152732bb211a93629484c035',
             '/test/test.txt': '18f6f8eb7b1c23d2bb61bff028b83d867a9e4643'
           }
         });
         done();
       })
        .catch(err => done.fail(err));
  });

  it('uses default `navigationUrls` if not provided', done => {
    const fs = new MockFilesystem({
      '/index.html': 'This is a test',
    });
    const gen = new Generator(fs, '/test');
    const res = gen.process({
      index: '/index.html',
    });
    res.then(config => {
         expect(config).toEqual({
           configVersion: 1,
           timestamp: 1234567890123,
           appData: undefined,
           index: '/test/index.html',
           assetGroups: [],
           dataGroups: [],
           navigationUrls: [
             {positive: true, regex: '^\\/.*$'},
             {positive: false, regex: '^\\/(?:.+\\/)?[^/]*\\.[^/]*$'},
             {positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*$'},
             {positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$'},
           ],
           hashTable: {}
         });
         done();
       })
        .catch(err => done.fail(err));
  });
});<commit_msg>refactor(service-worker): use `async/await` in SW config tests (#33903)<commit_after>/**
 * @license
 * Copyright Google Inc. 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 {Generator} from '../src/generator';
import {MockFilesystem} from '../testing/mock';

describe('Generator', () => {
  beforeEach(() => spyOn(Date, 'now').and.returnValue(1234567890123));

  it('generates a correct config', async() => {
    const fs = new MockFilesystem({
      '/index.html': 'This is a test',
      '/main.css': 'This is a CSS file',
      '/main.js': 'This is a JS file',
      '/main.ts': 'This is a TS file',
      '/test.txt': 'Another test',
      '/foo/test.html': 'Another test',
      '/ignored/x.html': 'should be ignored',
    });
    const gen = new Generator(fs, '/test');
    const config = await gen.process({
      appData: {
        test: true,
      },
      index: '/index.html',
      assetGroups: [{
        name: 'test',
        resources: {
          files: [
            '/**/*.html',
            '/**/*.?s',
            '!/ignored/**',
            '/**/*.txt',
          ],
          urls: [
            '/absolute/**',
            '/some/url?with+escaped+chars',
            'relative/*.txt',
          ],
        },
      }],
      dataGroups: [{
        name: 'other',
        urls: [
          '/api/**',
          'relapi/**',
          'https://example.com/**/*?with+escaped+chars',
        ],
        cacheConfig: {
          maxSize: 100,
          maxAge: '3d',
          timeout: '1m',
        },
      }],
      navigationUrls: [
        '/included/absolute/**',
        '!/excluded/absolute/**',
        '/included/some/url/with+escaped+chars',
        '!excluded/relative/*.txt',
        '!/api/?*',
        'http://example.com/included',
        '!http://example.com/excluded',
      ],
    });

    expect(config).toEqual({
      configVersion: 1,
      timestamp: 1234567890123,
      appData: {
        test: true,
      },
      index: '/test/index.html',
      assetGroups: [{
        name: 'test',
        installMode: 'prefetch',
        updateMode: 'prefetch',
        urls: [
          '/test/foo/test.html',
          '/test/index.html',
          '/test/main.js',
          '/test/main.ts',
          '/test/test.txt',
        ],
        patterns: [
          '\\/absolute\\/.*',
          '\\/some\\/url\\?with\\+escaped\\+chars',
          '\\/test\\/relative\\/[^/]*\\.txt',
        ],
      }],
      dataGroups: [{
        name: 'other',
        patterns: [
          '\\/api\\/.*',
          '\\/test\\/relapi\\/.*',
          'https:\\/\\/example\\.com\\/(?:.+\\/)?[^/]*\\?with\\+escaped\\+chars',
        ],
        strategy: 'performance',
        maxSize: 100,
        maxAge: 259200000,
        timeoutMs: 60000,
        version: 1,
      }],
      navigationUrls: [
        {positive: true, regex: '^\\/included\\/absolute\\/.*$'},
        {positive: false, regex: '^\\/excluded\\/absolute\\/.*$'},
        {positive: true, regex: '^\\/included\\/some\\/url\\/with\\+escaped\\+chars$'},
        {positive: false, regex: '^\\/test\\/excluded\\/relative\\/[^/]*\\.txt$'},
        {positive: false, regex: '^\\/api\\/[^/][^/]*$'},
        {positive: true, regex: '^http:\\/\\/example\\.com\\/included$'},
        {positive: false, regex: '^http:\\/\\/example\\.com\\/excluded$'},
      ],
      hashTable: {
        '/test/foo/test.html': '18f6f8eb7b1c23d2bb61bff028b83d867a9e4643',
        '/test/index.html': 'a54d88e06612d820bc3be72877c74f257b561b19',
        '/test/main.js': '41347a66676cdc0516934c76d9d13010df420f2c',
        '/test/main.ts': '7d333e31f0bfc4f8152732bb211a93629484c035',
        '/test/test.txt': '18f6f8eb7b1c23d2bb61bff028b83d867a9e4643',
      },
    });
  });

  it('uses default `navigationUrls` if not provided', async() => {
    const fs = new MockFilesystem({
      '/index.html': 'This is a test',
    });
    const gen = new Generator(fs, '/test');
    const config = await gen.process({
      index: '/index.html',
    });

    expect(config).toEqual({
      configVersion: 1,
      timestamp: 1234567890123,
      appData: undefined,
      index: '/test/index.html',
      assetGroups: [],
      dataGroups: [],
      navigationUrls: [
        {positive: true, regex: '^\\/.*$'},
        {positive: false, regex: '^\\/(?:.+\\/)?[^/]*\\.[^/]*$'},
        {positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*$'},
        {positive: false, regex: '^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$'},
      ],
      hashTable: {},
    });
  });
});
{'fraction_non_alphanumeric': 0.2148598516075845, 'fraction_numerical': 0.041323165704863975, 'mean_word_length': 1.5859312549960032, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 15, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3103605', 'n_tokens_mistral': 3483, 'n_tokens_neox': 3144, 'n_words': 549}