From 5dfd379dfbee94f4c3bf40b6df852222c9475509 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Wed, 1 Jun 2022 16:21:48 +0300 Subject: [PATCH 1/7] Fix angular 12 testing issue --- templates/app-nolayers/angular/src/test.ts | 3 +-- templates/app/angular/src/test.ts | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/templates/app-nolayers/angular/src/test.ts b/templates/app-nolayers/angular/src/test.ts index 61925f9803..85c74fe531 100644 --- a/templates/app-nolayers/angular/src/test.ts +++ b/templates/app-nolayers/angular/src/test.ts @@ -1,11 +1,10 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files - +import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import 'zone.js/testing'; declare const require: { context( diff --git a/templates/app/angular/src/test.ts b/templates/app/angular/src/test.ts index 61925f9803..5b643ec44d 100644 --- a/templates/app/angular/src/test.ts +++ b/templates/app/angular/src/test.ts @@ -1,11 +1,11 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files - +import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import 'zone.js/testing'; + declare const require: { context( From dd53c7b9960ce86a1e59c7226e5ec7819fa93a3b Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Wed, 1 Jun 2022 18:11:33 +0300 Subject: [PATCH 2/7] Add example tests to Home.component.spec.ts --- .../src/app/home/home.component.spec.ts | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 templates/app/angular/src/app/home/home.component.spec.ts diff --git a/templates/app/angular/src/app/home/home.component.spec.ts b/templates/app/angular/src/app/home/home.component.spec.ts new file mode 100644 index 0000000000..3ceff9410b --- /dev/null +++ b/templates/app/angular/src/app/home/home.component.spec.ts @@ -0,0 +1,100 @@ +import { CoreTestingModule } from "@abp/ng.core/testing"; +import { ThemeBasicTestingModule } from "@abp/ng.theme.basic/testing"; +import { ThemeSharedTestingModule } from "@abp/ng.theme.shared/testing"; +import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; +import { NgxValidateCoreModule } from "@ngx-validate/core"; +import { HomeComponent } from "./home.component"; +import { OAuthService } from 'angular-oauth2-oidc'; +import { AuthService } from '@abp/ng.core'; + + +describe("HomeComponent", () => { + let fixture: ComponentFixture; + const mockOAuthService = jasmine.createSpyObj('OAuthService', ['hasValidAccessToken']) + const mockAuthService = jasmine.createSpyObj('AuthService', ['navigateToLogin']) + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [HomeComponent], + imports: [ + CoreTestingModule.withConfig(), + ThemeSharedTestingModule.withConfig(), + ThemeBasicTestingModule.withConfig(), + NgxValidateCoreModule, + ], + providers: [ + /* mock providers here */ + { + provide: OAuthService, + useValue: mockOAuthService + }, + { + provide: AuthService, + useValue: mockAuthService + } + ], + }).compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeComponent); + fixture.detectChanges(); + }); + + it("should be initiated", () => { + expect(fixture.componentInstance).toBeTruthy(); + }); + + + + describe('when login state is true', () => { + beforeAll(() => { + mockOAuthService.hasValidAccessToken.and.returnValue(true) + }); + + it("hasLoggedIn should be true", () => { + + expect(fixture.componentInstance.hasLoggedIn).toBeTrue(); + expect(mockOAuthService.hasValidAccessToken).toHaveBeenCalled() + }) + + it("button should not be exists", () => { + const element = fixture.nativeElement + const button = element.querySelector('[role="button"]') + expect(button).toBeNull() + }) + + }) + + describe('when login state is false', () => { + beforeAll(() => { + mockOAuthService.hasValidAccessToken.and.returnValue(false) + }); + + it("hasLoggedIn should be false", () => { + + expect(fixture.componentInstance.hasLoggedIn).toBeFalse(); + expect(mockOAuthService.hasValidAccessToken).toHaveBeenCalled() + }) + + it("button should be exists", () => { + const element = fixture.nativeElement + const button = element.querySelector('[role="button"]') + expect(button).toBeDefined() + }) + describe('when button clicked', () => { + + beforeEach(() => { + const element = fixture.nativeElement + const button = element.querySelector('[role="button"]') + button.click() + }); + + it("navigateToLogin have been called", () => { + expect(mockAuthService.navigateToLogin).toHaveBeenCalled() + }) + }) + }) + +}); \ No newline at end of file From adfd61c6e85465d3a4ab7d4a106edbfed5be0138 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Tue, 11 Oct 2022 15:10:30 +0300 Subject: [PATCH 3/7] Fix exists test issues on Module Template --- .../src/lib/my-project-name.component.spec.ts | 20 +++++++++++++------ .../src/lib/my-project-name.service.spec.ts | 15 ++++++++++---- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/templates/module/angular/projects/my-project-name/src/lib/my-project-name.component.spec.ts b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.component.spec.ts index 88f67b1e65..4d6aae3ac8 100644 --- a/templates/module/angular/projects/my-project-name/src/lib/my-project-name.component.spec.ts +++ b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.component.spec.ts @@ -1,16 +1,24 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { MyProjectNameComponent } from './my-project-name.component'; +import { MyProjectNameComponent } from './components/my-project-name.component'; +import { MyProjectNameService } from '@my-company-name/my-project-name'; +import { of } from 'rxjs'; describe('MyProjectNameComponent', () => { let component: MyProjectNameComponent; let fixture: ComponentFixture; - + const mockMyProjectNameService = jasmine.createSpyObj('MyProjectNameService', { + sample: of([]), + }); beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ MyProjectNameComponent ] - }) - .compileComponents(); + declarations: [MyProjectNameComponent], + providers: [ + { + provide: MyProjectNameService, + useValue: mockMyProjectNameService, + }, + ], + }).compileComponents(); })); beforeEach(() => { diff --git a/templates/module/angular/projects/my-project-name/src/lib/my-project-name.service.spec.ts b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.service.spec.ts index 7955ce073c..ec7aeb6c68 100644 --- a/templates/module/angular/projects/my-project-name/src/lib/my-project-name.service.spec.ts +++ b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.service.spec.ts @@ -1,12 +1,19 @@ import { TestBed } from '@angular/core/testing'; - -import { MyProjectNameService } from './my-project-name.service'; +import { MyProjectNameService } from './services/my-project-name.service'; +import { RestService } from '@abp/ng.core'; describe('MyProjectNameService', () => { let service: MyProjectNameService; - + const mockRestService = jasmine.createSpyObj('RestService', ['request']); beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + providers: [ + { + provide: RestService, + useValue: mockRestService, + }, + ], + }); service = TestBed.inject(MyProjectNameService); }); From b7c14ae597f929ff2f2460e48f0c01a68eb6650d Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 11 Oct 2022 15:14:27 +0300 Subject: [PATCH 4/7] Cli: Fix project creation problems in 5.3.4 resolves https://github.com/volosoft/volo/issues/12220 --- .../Abp/Cli/ProjectBuilding/Files/FileEntryExtensions.cs | 2 +- .../Templates/RemoveUnnecessaryPortsStep.cs | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntryExtensions.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntryExtensions.cs index a5085f83a9..98ddb005a9 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntryExtensions.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntryExtensions.cs @@ -120,7 +120,7 @@ public static class FileEntryExtensions } } - if (lines[i+1].Contains(" Date: Tue, 11 Oct 2022 15:48:16 +0300 Subject: [PATCH 5/7] Fix exists test issues on app-nolayers Template --- .../src/app/home/home.component.spec.ts | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 templates/app-nolayers/angular/src/app/home/home.component.spec.ts diff --git a/templates/app-nolayers/angular/src/app/home/home.component.spec.ts b/templates/app-nolayers/angular/src/app/home/home.component.spec.ts new file mode 100644 index 0000000000..9622abc9f6 --- /dev/null +++ b/templates/app-nolayers/angular/src/app/home/home.component.spec.ts @@ -0,0 +1,62 @@ +import { CoreTestingModule } from '@abp/ng.core/testing'; +import { ThemeBasicTestingModule } from '@abp/ng.theme.basic/testing'; +import { ThemeSharedTestingModule } from '@abp/ng.theme.shared/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; +import { HomeComponent } from './home.component'; +import { OAuthService } from 'angular-oauth2-oidc'; +import { AuthService } from '@abp/ng.core'; + +describe('HomeComponent', () => { + let fixture: ComponentFixture; + const mockOAuthService = jasmine.createSpyObj('OAuthService', ['hasValidAccessToken']); + const mockAuthService = jasmine.createSpyObj('AuthService', ['navigateToLogin']); + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [HomeComponent], + imports: [ + CoreTestingModule.withConfig(), + ThemeSharedTestingModule.withConfig(), + ThemeBasicTestingModule.withConfig(), + NgxValidateCoreModule, + ], + providers: [ + /* mock providers here */ + { + provide: OAuthService, + useValue: mockOAuthService, + }, + { + provide: AuthService, + useValue: mockAuthService, + }, + ], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeComponent); + fixture.detectChanges(); + }); + + it('should be initiated', () => { + expect(fixture.componentInstance).toBeTruthy(); + }); + + describe('when login state is true', () => { + beforeAll(() => { + mockOAuthService.hasValidAccessToken.and.returnValue(true); + }); + + it('hasLoggedIn should be true', () => { + expect(fixture.componentInstance.hasLoggedIn).toBeTrue(); + expect(mockOAuthService.hasValidAccessToken).toHaveBeenCalled(); + }); + + it('button should not be exists', () => { + const element = fixture.nativeElement; + const cardTitle = element.querySelector('.card-title'); + expect(cardTitle).toBeTruthy(); + }); + }); +}); From 691a02c46a0dd61f8647008e4c988765cd47a7bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Tue, 11 Oct 2022 16:35:45 +0300 Subject: [PATCH 6/7] Added Input Values can control checkbox with node click. --- .../tree/src/lib/components/tree.component.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts index 3f6179a5b2..24e2c8128a 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts +++ b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts @@ -3,6 +3,7 @@ import { ContentChild, EventEmitter, Input, + OnChanges, Output, TemplateRef, ViewEncapsulation, @@ -24,7 +25,7 @@ export type DropEvent = NzFormatEmitEvent & { pos: number }; ], encapsulation: ViewEncapsulation.None, }) -export class TreeComponent { +export class TreeComponent implements OnChanges { dropPosition: number; dropdowns = {} as { [key: string]: NgbDropdown }; @@ -44,19 +45,31 @@ export class TreeComponent { @Input() nodes = []; @Input() expandedKeys: string[] = []; @Input() selectedNode: any; + @Input() changeCheckboxWithNode: boolean; + @Input() changedNodeValues = []; @Input() isNodeSelected = node => this.selectedNode?.id === node.key; @Input() beforeDrop = (event: NzFormatBeforeDropEvent) => { this.dropPosition = event.pos; return of(false); }; + ngOnChanges() { + this.checkedKeys = [...this.changedNodeValues]; + } + onSelectedNodeChange(node) { this.selectedNode = node.origin.entity; - this.selectedNodeChange.emit(node.origin.entity); + if (this.changeCheckboxWithNode) { + this.selectedNodeChange.emit(node); + this.checkedKeys = [...this.changedNodeValues]; + this.checkedKeysChange.emit(this.changedNodeValues); + } else { + this.selectedNodeChange.emit(node.origin.entity); + } } onCheckboxChange(event) { - this.checkedKeys = [...event.keys]; + this.checkedKeys = this.changedNodeValues = [...event.keys]; this.checkedKeysChange.emit(event.keys); } From 55d541d194e075906110e6610e7f855f24340863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Tue, 11 Oct 2022 16:37:40 +0300 Subject: [PATCH 7/7] Deleted #treeTemplate class because of text and checkbox is not same line. --- .../components/tree/src/lib/components/tree.component.html | 1 - 1 file changed, 1 deletion(-) diff --git a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html index 9cf973c103..34bb64ec1f 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html +++ b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html @@ -16,7 +16,6 @@ >