|
| 1 | +import { filesystem } from 'gluegun'; |
| 2 | + |
| 3 | +import { runNgxdCLI } from '../../../../utils/cli-test-setup'; |
| 4 | +import { getLineNumber } from '../../../../utils/functions.test.helper'; |
| 5 | + |
| 6 | +describe('Commands: [Generate] => [Store] => [NgSimpleState]', () => { |
| 7 | + const TESTING_DIR = '__SST_TEST__'; |
| 8 | + const COMMAND = 'g st sst'; |
| 9 | + |
| 10 | + beforeEach(() => { |
| 11 | + jest.useFakeTimers(); |
| 12 | + jest.setTimeout(100000); |
| 13 | + }); |
| 14 | + |
| 15 | + afterEach(() => { |
| 16 | + jest.clearAllTimers(); |
| 17 | + }); |
| 18 | + |
| 19 | + afterAll(() => { |
| 20 | + filesystem.remove(TESTING_DIR); |
| 21 | + }); |
| 22 | + |
| 23 | + test('should generate a ng-simple-state store with 2 files', async () => { |
| 24 | + const name = 'base-fruit'; |
| 25 | + await runNgxdCLI(`${COMMAND} ${name}`); |
| 26 | + |
| 27 | + const ts = filesystem.read(`${name}/${name}.store.ts`); |
| 28 | + const spec = filesystem.read(`${name}/${name}.store.spec.ts`); |
| 29 | + |
| 30 | + expect(ts).toBeDefined(); |
| 31 | + expect(spec).toBeDefined(); |
| 32 | + |
| 33 | + filesystem.remove(name); |
| 34 | + }); |
| 35 | + |
| 36 | + test('should generate a ng-simple-state store at given path', async () => { |
| 37 | + const path = `${TESTING_DIR}/store`; |
| 38 | + const name = 'fruit1'; |
| 39 | + |
| 40 | + await runNgxdCLI(`${COMMAND} ${name} --path ${path}`); |
| 41 | + |
| 42 | + const ts = filesystem.read(`${path}/${name}/${name}.store.ts`); |
| 43 | + const spec = filesystem.read(`${path}/${name}/${name}.store.spec.ts`); |
| 44 | + |
| 45 | + expect(ts).toBeDefined(); |
| 46 | + expect(spec).toBeDefined(); |
| 47 | + }); |
| 48 | + |
| 49 | + test('should generate a ng-simple-state store.ts file with correct content', async () => { |
| 50 | + const path = `${TESTING_DIR}/store`; |
| 51 | + const name = 'fruit2'; |
| 52 | + |
| 53 | + await runNgxdCLI(`${COMMAND} ${name} --path ${path}`); |
| 54 | + |
| 55 | + const ts = filesystem.read(`${path}/${name}/${name}.store.ts`); |
| 56 | + |
| 57 | + const lines = ts.split(/\r?\n/); |
| 58 | + |
| 59 | + expect(getLineNumber(lines, 1)).toContain(`import { Injectable, Injector } from '@angular/core'`); |
| 60 | + |
| 61 | + expect(getLineNumber(lines, 3)).toContain(`import { NgSimpleStateBaseStore } from 'ng-simple-state'`); |
| 62 | + expect(getLineNumber(lines, 4)).toContain(`import { Observable, switchMap, tap } from 'rxjs'`); |
| 63 | + |
| 64 | + expect(getLineNumber(lines, 6)).toContain(`export interface Fruit2State {`); |
| 65 | + expect(getLineNumber(lines, 7)).toContain(`fruit2s: Fruit2Response[];`); |
| 66 | + expect(getLineNumber(lines, 8)).toContain(`}`); |
| 67 | + |
| 68 | + expect(getLineNumber(lines, 10)).toContain(`export const FRUIT2_INITIAL_STATE: Fruit2State = {`); |
| 69 | + expect(getLineNumber(lines, 11)).toContain(`fruit2s: [],`); |
| 70 | + expect(getLineNumber(lines, 12)).toContain(`}`); |
| 71 | + |
| 72 | + expect(getLineNumber(lines, 14)).toContain(`@Injectable()`); |
| 73 | + expect(getLineNumber(lines, 15)).toContain( |
| 74 | + `export class Fruit2Store extends NgSimpleStateBaseStore<Fruit2State> {` |
| 75 | + ); |
| 76 | + expect(getLineNumber(lines, 16)).toContain('constructor('); |
| 77 | + expect(getLineNumber(lines, 17)).toContain('injector: Injector,'); |
| 78 | + expect(getLineNumber(lines, 18)).toContain('private readonly fruit2ApiService: Fruit2ApiService'); |
| 79 | + expect(getLineNumber(lines, 19)).toContain(') {'); |
| 80 | + expect(getLineNumber(lines, 20)).toContain('super(injector);'); |
| 81 | + expect(getLineNumber(lines, 21)).toContain('}'); |
| 82 | + |
| 83 | + expect(getLineNumber(lines, 23)).toContain('initialState(): Fruit2State {'); |
| 84 | + expect(getLineNumber(lines, 24)).toContain('return FRUIT2_INITIAL_STATE;'); |
| 85 | + expect(getLineNumber(lines, 25)).toContain('}'); |
| 86 | + |
| 87 | + expect(getLineNumber(lines, 27)).toContain('create(fruit2Request: Fruit2Request): Observable<Fruit2Response> {'); |
| 88 | + expect(getLineNumber(lines, 28)).toContain('return this.fruit2ApiService.create(fruit2Request).pipe('); |
| 89 | + expect(getLineNumber(lines, 29)).toContain('tap((fruit2) => {'); |
| 90 | + expect(getLineNumber(lines, 30)).toContain( |
| 91 | + 'this.setState((state) => ({ ...state, fruit2s: [...state.fruit2s, fruit2] }));' |
| 92 | + ); |
| 93 | + expect(getLineNumber(lines, 31)).toContain('})'); |
| 94 | + expect(getLineNumber(lines, 32)).toContain(');'); |
| 95 | + expect(getLineNumber(lines, 33)).toContain('}'); |
| 96 | + |
| 97 | + expect(getLineNumber(lines, 35)).toContain('update(fruit2ID: number, fruit2Request: Fruit2Request) {'); |
| 98 | + expect(getLineNumber(lines, 36)).toContain('return this.fruit2ApiService.update(fruit2ID, fruit2Request).pipe('); |
| 99 | + expect(getLineNumber(lines, 37)).toContain('tap((fruit2) => {'); |
| 100 | + expect(getLineNumber(lines, 38)).toContain('this.setState((state) => {'); |
| 101 | + expect(getLineNumber(lines, 39)).toContain( |
| 102 | + 'const targetFruit2Index = state.fruit2s.findIndex((item) => item.fruit2ID === fruit2ID);' |
| 103 | + ); |
| 104 | + expect(getLineNumber(lines, 40)).toContain('const fruit2s = [...state.fruit2s];'); |
| 105 | + expect(getLineNumber(lines, 41)).toContain('fruit2s[targetFruit2Index] = fruit2;'); |
| 106 | + expect(getLineNumber(lines, 42)).toContain('return { ...state, fruit2s };'); |
| 107 | + expect(getLineNumber(lines, 43)).toContain('});'); |
| 108 | + expect(getLineNumber(lines, 44)).toContain('})'); |
| 109 | + expect(getLineNumber(lines, 45)).toContain(');'); |
| 110 | + expect(getLineNumber(lines, 46)).toContain('}'); |
| 111 | + |
| 112 | + expect(getLineNumber(lines, 48)).toContain('remove(fruit2ID: number) {'); |
| 113 | + expect(getLineNumber(lines, 49)).toContain('return this.fruit2ApiService.remove(fruit2ID).pipe('); |
| 114 | + expect(getLineNumber(lines, 50)).toContain('tap(() => {'); |
| 115 | + expect(getLineNumber(lines, 51)).toContain('this.setState((state) => ({'); |
| 116 | + expect(getLineNumber(lines, 52)).toContain( |
| 117 | + 'fruit2s: state.fruit2s.filter((fruit2) => fruit2.fruit2ID !== fruit2ID),' |
| 118 | + ); |
| 119 | + expect(getLineNumber(lines, 53)).toContain('}));'); |
| 120 | + expect(getLineNumber(lines, 54)).toContain('})'); |
| 121 | + expect(getLineNumber(lines, 55)).toContain(');'); |
| 122 | + expect(getLineNumber(lines, 56)).toContain('}'); |
| 123 | + |
| 124 | + expect(getLineNumber(lines, 58)).toContain('findAll(fruit2ID: number): Observable<Fruit2Response[]> {'); |
| 125 | + expect(getLineNumber(lines, 59)).toContain('return this.fruit2ApiService.findAll(+ministryID).pipe('); |
| 126 | + expect(getLineNumber(lines, 60)).toContain('tap((fruit2s) => {'); |
| 127 | + expect(getLineNumber(lines, 61)).toContain('this.setState((state) => ({ ...state, fruit2s }));'); |
| 128 | + expect(getLineNumber(lines, 62)).toContain('})'); |
| 129 | + expect(getLineNumber(lines, 63)).toContain('switchMap(() => this.selectState((state) => state.fruit2s))'); |
| 130 | + expect(getLineNumber(lines, 64)).toContain(');'); |
| 131 | + expect(getLineNumber(lines, 65)).toContain('}'); |
| 132 | + |
| 133 | + expect(getLineNumber(lines, 67)).toContain('findByID(fruit2ID: number): Observable<Fruit2Response> {'); |
| 134 | + expect(getLineNumber(lines, 68)).toContain('return this.fruit2ApiService.findByID(fruit2ID);'); |
| 135 | + expect(getLineNumber(lines, 69)).toContain('}'); |
| 136 | + expect(getLineNumber(lines, 70)).toContain('}'); |
| 137 | + |
| 138 | + expect(lines.length).toBe(71); |
| 139 | + |
| 140 | + filesystem.remove(`${name}`); |
| 141 | + }); |
| 142 | +}); |
0 commit comments