Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions frontend/angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,6 @@
"**/drag-drop.service.spec.ts",
"**/app/common/formly/preset-wrapper/preset-wrapper.component.spec.ts",
"**/app/common/service/user/config/user-config.service.spec.ts",
"**/app/dashboard/component/dashboard.component.spec.ts",
"**/app/dashboard/component/user/user-project/user-project-list-item/user-project-list-item.component.spec.ts",
"**/app/dashboard/component/user/user-workflow/user-workflow-list-item/user-workflow-list-item.component.spec.ts",
"**/app/dashboard/component/user/user-workflow/user-workflow.component.spec.ts",
"**/app/workspace/component/code-editor-dialog/code-debugger.component.spec.ts",
"**/app/workspace/component/code-editor-dialog/code-editor.component.spec.ts",
"**/app/workspace/component/codearea-custom-template/codearea-custom-template.component.spec.ts",
Expand Down
20 changes: 14 additions & 6 deletions frontend/src/app/dashboard/component/dashboard.component.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@

import { ComponentFixture, TestBed } from "@angular/core/testing";
import { DashboardComponent } from "./dashboard.component";
import { ChangeDetectorRef, EventEmitter, NgZone, NO_ERRORS_SCHEMA } from "@angular/core";
import { ChangeDetectorRef, EventEmitter, NgZone } from "@angular/core";
import { By } from "@angular/platform-browser";
import { of } from "rxjs";
import { EMPTY, of } from "rxjs";

import { UserService } from "../../common/service/user/user.service";
import { FlarumService } from "../service/user/flarum/flarum.service";
import { SocialAuthService } from "@abacritt/angularx-social-login";
import { AdminSettingsService } from "../service/admin/settings/admin-settings.service";
import {
ActivatedRoute,
ActivatedRouteSnapshot,
Expand All @@ -50,6 +51,7 @@ describe("DashboardComponent", () => {
let cdrMock: Partial<ChangeDetectorRef>;
let ngZoneMock: Partial<NgZone>;
let socialAuthServiceMock: Partial<SocialAuthService>;
let adminSettingsServiceMock: Partial<AdminSettingsService>;
let activatedRouteMock: Partial<ActivatedRoute>;

const activatedRouteSnapshotMock: Partial<ActivatedRouteSnapshot> = {
Expand Down Expand Up @@ -105,27 +107,33 @@ describe("DashboardComponent", () => {
};

socialAuthServiceMock = {
authState: of(),
authState: EMPTY,
// GoogleSigninButtonDirective subscribes to initState in its constructor;
// EMPTY keeps the subscription open without triggering google.accounts.id.renderButton.
initState: EMPTY,
};

adminSettingsServiceMock = {
getSetting: vi.fn().mockReturnValue(EMPTY),
};

activatedRouteMock = {
snapshot: activatedRouteSnapshotMock as ActivatedRouteSnapshot,
};

await TestBed.configureTestingModule({
declarations: [DashboardComponent],
imports: [HttpClientTestingModule],
imports: [DashboardComponent, HttpClientTestingModule],
providers: [
{ provide: UserService, useValue: userServiceMock },
{ provide: Router, useValue: routerMock },
{ provide: FlarumService, useValue: flarumServiceMock },
{ provide: ChangeDetectorRef, useValue: cdrMock },
{ provide: NgZone, useValue: ngZoneMock },
{ provide: SocialAuthService, useValue: socialAuthServiceMock },
{ provide: AdminSettingsService, useValue: adminSettingsServiceMock },
{ provide: ActivatedRoute, useValue: activatedRouteMock },
...commonTestProviders,
],
schemas: [NO_ERRORS_SCHEMA],
}).compileComponents();
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,42 @@
* under the License.
*/

import { Component, ViewChild } from "@angular/core";
import { ComponentFixture, TestBed } from "@angular/core/testing";
import { UserProjectListItemComponent } from "./user-project-list-item.component";
import { NotificationService } from "src/app/common/service/notification/notification.service";
import { UserProjectService } from "../../../../service/user/project/user-project.service";
import { DashboardProject } from "../../../../type/dashboard-project.interface";
import { HttpClientTestingModule } from "@angular/common/http/testing";
import { NzListComponent } from "ng-zorro-antd/list";
import { NzModalService } from "ng-zorro-antd/modal";
import { provideRouter } from "@angular/router";
import { StubUserService } from "../../../../../common/service/user/stub-user.service";
import { UserService } from "../../../../../common/service/user/user.service";
import { HighlightSearchTermsPipe } from "../../user-workflow/user-workflow-list-item/highlight-search-terms.pipe";
import { commonTestProviders } from "../../../../../common/testing/test-utils";

// UserProjectListItemComponent is rooted at <nz-list-item>; instantiating it
// outside an <nz-list> host throws "No provider found for NzListComponent".
@Component({
standalone: true,
imports: [NzListComponent, UserProjectListItemComponent],
template: `
<nz-list>
<texera-user-project-list-item
[entry]="entry"
[editable]="editable"></texera-user-project-list-item>
</nz-list>
`,
})
class TestHostComponent {
entry!: DashboardProject;
editable = true;
@ViewChild(UserProjectListItemComponent, { static: true }) inner!: UserProjectListItemComponent;
}

describe("UserProjectListItemComponent", () => {
let component: UserProjectListItemComponent;
let fixture: ComponentFixture<UserProjectListItemComponent>;
let hostFixture: ComponentFixture<TestHostComponent>;
const januaryFirst1970 = 28800000; // 1970-01-01 in PST
const testProject: DashboardProject = {
color: null,
Expand All @@ -45,24 +66,24 @@ describe("UserProjectListItemComponent", () => {

beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [UserProjectListItemComponent, HighlightSearchTermsPipe],
imports: [TestHostComponent, HttpClientTestingModule],
providers: [
NotificationService,
UserProjectService,
NzModalService,
{ provide: UserService, useClass: StubUserService },
provideRouter([]),
...commonTestProviders,
],
imports: [HttpClientTestingModule],
}).compileComponents();
});

beforeEach(() => {
fixture = TestBed.createComponent(UserProjectListItemComponent);
component = fixture.componentInstance;
component.entry = testProject;
component.editable = true;
fixture.detectChanges();
hostFixture = TestBed.createComponent(TestHostComponent);
hostFixture.componentInstance.entry = testProject;
hostFixture.componentInstance.editable = true;
hostFixture.detectChanges();
component = hostFixture.componentInstance.inner;
});

it("should create", () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
* under the License.
*/

import { Component, ViewChild } from "@angular/core";
import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing";
import { UserWorkflowListItemComponent } from "./user-workflow-list-item.component";
import { FileSaverService } from "../../../../service/user/file/file-saver.service";
Expand All @@ -26,34 +27,56 @@ import { StubWorkflowPersistService } from "../../../../../common/service/workfl
import { WorkflowPersistService } from "../../../../../common/service/workflow-persist/workflow-persist.service";
import { UserProjectService } from "../../../../service/user/project/user-project.service";
import { StubUserProjectService } from "../../../../service/user/project/stub-user-project.service";
import { NzListComponent } from "ng-zorro-antd/list";
import { NzModalModule } from "ng-zorro-antd/modal";
import { HttpClientTestingModule } from "@angular/common/http/testing";
import { HighlightSearchTermsPipe } from "./highlight-search-terms.pipe";
import { provideRouter } from "@angular/router";
import { DashboardEntry } from "../../../../type/dashboard-entry";
import { NzTooltipModule } from "ng-zorro-antd/tooltip";
import { commonTestProviders } from "../../../../../common/testing/test-utils";

// UserWorkflowListItemComponent is rooted at <nz-list-item>; instantiating it
// outside an <nz-list> host throws "No provider found for NzListComponent".
@Component({
standalone: true,
imports: [NzListComponent, UserWorkflowListItemComponent],
template: `
<nz-list>
<texera-user-workflow-list-item
[entry]="entry"
[editable]="editable"></texera-user-workflow-list-item>
</nz-list>
`,
})
class TestHostComponent {
entry!: DashboardEntry;
editable = true;
@ViewChild(UserWorkflowListItemComponent, { static: true }) inner!: UserWorkflowListItemComponent;
}

describe("UserWorkflowListItemComponent", () => {
let component: UserWorkflowListItemComponent;
let fixture: ComponentFixture<UserWorkflowListItemComponent>;
let fixture: ComponentFixture<TestHostComponent>;
const fileSaverServiceSpy = { saveAs: vi.fn() } as any;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [NzModalModule, HttpClientTestingModule, NzTooltipModule],
declarations: [UserWorkflowListItemComponent, HighlightSearchTermsPipe],
imports: [TestHostComponent, NzModalModule, HttpClientTestingModule, NzTooltipModule],
providers: [
{ provide: WorkflowPersistService, useValue: new StubWorkflowPersistService(testWorkflowEntries) },
{ provide: UserProjectService, useValue: new StubUserProjectService() },
{ provide: FileSaverService, useValue: fileSaverServiceSpy },
provideRouter([]),
...commonTestProviders,
],
}).compileComponents();
});

beforeEach(() => {
fixture = TestBed.createComponent(UserWorkflowListItemComponent);
component = fixture.componentInstance;
component.entry = testWorkflowEntries[0];
component.editable = true;
fixture = TestBed.createComponent(TestHostComponent);
fixture.componentInstance.entry = testWorkflowEntries[0];
fixture.componentInstance.editable = true;
fixture.detectChanges();
component = fixture.componentInstance.inner;
});

it("should create", () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,6 @@ <h2 class="page-title">Workflows</h2>
nzMode="tags"
nzPlaceHolder="Search all workflows"
nzVariant="borderless"
]="true"
[nzOpen]="false"
ngDefaultControl
[(ngModel)]="filters.masterFilterList"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
* under the License.
*/

import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing";
import { ComponentFixture, TestBed } from "@angular/core/testing";
import { RouterTestingModule } from "@angular/router/testing";
import { HttpClientTestingModule } from "@angular/common/http/testing";
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
Expand Down Expand Up @@ -67,17 +67,10 @@ describe("SavedWorkflowSectionComponent", () => {

let downloadServiceSpy: any;

beforeEach(waitForAsync(() => {
beforeEach(async () => {
downloadServiceSpy = { downloadWorkflowsAsZip: vi.fn() } as any;

TestBed.configureTestingModule({
declarations: [
UserWorkflowComponent,
ShareAccessComponent,
FiltersComponent,
UserWorkflowListItemComponent,
SearchResultsComponent,
],
await TestBed.configureTestingModule({
providers: [
NzModalService,
{ provide: WorkflowPersistService, useValue: new StubWorkflowPersistService(testWorkflowEntries) },
Expand All @@ -95,6 +88,11 @@ describe("SavedWorkflowSectionComponent", () => {
...commonTestProviders,
],
imports: [
UserWorkflowComponent,
ShareAccessComponent,
FiltersComponent,
UserWorkflowListItemComponent,
SearchResultsComponent,
FormsModule,
RouterTestingModule,
HttpClientTestingModule,
Expand All @@ -114,7 +112,7 @@ describe("SavedWorkflowSectionComponent", () => {
NzButtonModule,
],
}).compileComponents();
}));
});

beforeEach(() => {
fixture = TestBed.createComponent(UserWorkflowComponent);
Expand Down
13 changes: 1 addition & 12 deletions frontend/src/tsconfig.spec.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,6 @@
"**/app/workspace/component/left-panel/time-travel/time-travel.component.spec.ts",
"**/app/workspace/component/left-panel/versions-list/versions-list.component.spec.ts",
"**/app/workspace/component/property-editor/operator-property-edit-frame/operator-property-edit-frame.component.spec.ts",
"**/app/workspace/component/workflow-editor/workflow-editor.component.spec.ts",

// Component templates rooted at <nz-list-item>: outside an <nz-list>
// host these throw `No provider found for NzListComponent`. Need a
// wrapper TestHostComponent that mounts them inside <nz-list>.
"**/app/dashboard/component/user/user-project/user-project-list-item/user-project-list-item.component.spec.ts",
"**/app/dashboard/component/user/user-workflow/user-workflow-list-item/user-workflow-list-item.component.spec.ts",
// user-workflow embeds the list-item above, cascading the same NzList host issue.
"**/app/dashboard/component/user/user-workflow/user-workflow.component.spec.ts",
// Dashboard renders <asl-google-signin-button> which dereferences fields on the
// SocialAuthService stub that our minimal mock doesn't provide.
"**/app/dashboard/component/dashboard.component.spec.ts"
"**/app/workspace/component/workflow-editor/workflow-editor.component.spec.ts"
]
}
Loading