Skip to content

Commit

Permalink
Improved unit tests for dataset commit service
Browse files Browse the repository at this point in the history
  • Loading branch information
zaychenko-sergei committed Aug 4, 2023
1 parent 91792c3 commit c824cde
Show file tree
Hide file tree
Showing 3 changed files with 146 additions and 71 deletions.
5 changes: 4 additions & 1 deletion src/app/dataset-view/additional-components/data-tabs.mock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -819,6 +819,8 @@ export const mockOverviewWithSetLicense = {
lastUpdatedAt: "2022-08-05T21:15:03.947245004+00:00",
};

export const mockCommitEventToDatasetMutationErrorMessage = "Fail";

export const mockCommitEventToDatasetMutationError: CommitEventToDatasetMutation =
{
datasets: {
Expand All @@ -827,7 +829,8 @@ export const mockCommitEventToDatasetMutationError: CommitEventToDatasetMutation
chain: {
commitEvent: {
__typename: "CommitResultAppendError",
message: "Fail",
message:
mockCommitEventToDatasetMutationErrorMessage,
},
__typename: "MetadataChainMut",
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,35 @@ import { DatasetCommitService } from "./dataset-commit.service";
import { Apollo, ApolloModule } from "apollo-angular";
import { ApolloTestingModule } from "apollo-angular/testing";
import { DatasetApi } from "src/app/api/dataset.api";
import { of } from "rxjs";
import { Observable, Subscription, of } from "rxjs";
import { mockDatasetMainDataResponse } from "src/app/search/mock.data";
import { DatasetByAccountAndDatasetNameQuery } from "src/app/api/kamu.graphql.interface";
import { NavigationService } from "src/app/services/navigation.service";
import {
mockCommitEventToDatasetMutation,
mockCommitEventToDatasetMutationError,
mockCommitEventToDatasetMutationErrorMessage,
mockUpdateReadmeMutation,
} from "../../data-tabs.mock";
import { DatasetViewTypeEnum } from "src/app/dataset-view/dataset-view.interface";
import { DatasetService } from "src/app/dataset-view/dataset.service";
import { first } from "rxjs/operators";

describe("DatasetCommitService", () => {
let service: DatasetCommitService;
let commitService: DatasetCommitService;
let datasetService: DatasetService;
let datasetApi: DatasetApi;
let navigationService: NavigationService;

let getDatasetInfoSpy: jasmine.Spy;
let navigationServiceSpy: jasmine.Spy;
let requestDatasetMainDataSpy: jasmine.Spy;

const TEST_ACCOUNT_NAME = "accountName";
const TEST_DATASET_NAME = "datasetName";
const TEST_DATASET_ID: string = mockDatasetMainDataResponse.datasets
.byOwnerAndName?.id as string;
const TEST_EVENT_CONTENT = "event content";

beforeEach(() => {
TestBed.configureTestingModule({
Expand All @@ -28,111 +40,170 @@ describe("DatasetCommitService", () => {
});
datasetApi = TestBed.inject(DatasetApi);
navigationService = TestBed.inject(NavigationService);
service = TestBed.inject(DatasetCommitService);
spyOn(
commitService = TestBed.inject(DatasetCommitService);
datasetService = TestBed.inject(DatasetService);

getDatasetInfoSpy = spyOn(
datasetApi,
"getDatasetInfoByAccountAndDatasetName",
).and.returnValue(
of(
mockDatasetMainDataResponse as DatasetByAccountAndDatasetNameQuery,
),
);

requestDatasetMainDataSpy = spyOn(
datasetService,
"requestDatasetMainData",
).and.returnValue(of());

navigationServiceSpy = spyOn(
navigationService,
"navigateToDatasetView",
);
});

it("should be created", () => {
expect(service).toBeTruthy();
expect(commitService).toBeTruthy();
});

function requestDatasetId(): Observable<string> {
return commitService.getIdByAccountNameAndDatasetName(
TEST_ACCOUNT_NAME,
TEST_DATASET_NAME,
);
}

function requestCommitEvent(): Observable<void> {
return commitService.commitEventToDataset(
TEST_ACCOUNT_NAME,
TEST_DATASET_NAME,
TEST_EVENT_CONTENT,
);
}

function expectNavigatedToDatasetOverview() {
expect(navigationServiceSpy).toHaveBeenCalledOnceWith({
accountName: TEST_ACCOUNT_NAME,
datasetName: TEST_DATASET_NAME,
tab: DatasetViewTypeEnum.Overview,
});
}

function expectRequestedDatasetMainData() {
expect(requestDatasetMainDataSpy).toHaveBeenCalledOnceWith({
accountName: TEST_ACCOUNT_NAME,
datasetName: TEST_DATASET_NAME,
});
}

it("should check getIdByAccountNameAndDatasetName() method with cache", fakeAsync(() => {
const key = TEST_ACCOUNT_NAME + TEST_DATASET_NAME;
service.datasetIdsByAccountDatasetName.set(key, "testId");
service
.getIdByAccountNameAndDatasetName(
TEST_ACCOUNT_NAME,
TEST_DATASET_NAME,
)
.subscribe((data) => {
expect(data).toEqual("testId");
// 1st requests queries the API
let eventsCount = 0;
requestDatasetId().subscribe((data) => {
++eventsCount;
expect(data).toEqual(TEST_DATASET_ID);
tick();

// Issue 2nd request after first to ensure previous value was cached
requestDatasetId().subscribe((data) => {
++eventsCount;
expect(data).toEqual(TEST_DATASET_ID);
tick();
});
});
flush();

expect(eventsCount).toEqual(2);
expect(getDatasetInfoSpy).toHaveBeenCalledOnceWith(
TEST_ACCOUNT_NAME,
TEST_DATASET_NAME,
);
}));

it("should check getIdByAccountNameAndDatasetName() method without cache", fakeAsync(() => {
service
.getIdByAccountNameAndDatasetName(
TEST_ACCOUNT_NAME,
TEST_DATASET_NAME,
)
.subscribe((data) => {
expect(data).toEqual(
mockDatasetMainDataResponse.datasets.byOwnerAndName
?.id as string,
);
tick();
});
let eventsCount = 0;
requestDatasetId().subscribe((data) => {
++eventsCount;
expect(data).toEqual(TEST_DATASET_ID);
tick();
});
flush();

expect(eventsCount).toEqual(1);
expect(getDatasetInfoSpy).toHaveBeenCalledOnceWith(
TEST_ACCOUNT_NAME,
TEST_DATASET_NAME,
);
}));

it("should check commitEventToDataset() method", fakeAsync(() => {
spyOn(datasetApi, "commitEvent").and.returnValue(
const commitEventSpy = spyOn(datasetApi, "commitEvent").and.returnValue(
of(mockCommitEventToDatasetMutation),
);
const navigationServiceSpy = spyOn(
navigationService,
"navigateToDatasetView",
);
service
.commitEventToDataset(
TEST_ACCOUNT_NAME,
TEST_DATASET_NAME,
"contentEvent",
)
.subscribe(() => {
expect(navigationServiceSpy).toHaveBeenCalledTimes(1);
tick();
});

requestCommitEvent().subscribe(() => {
tick();
});
flush();

expect(commitEventSpy).toHaveBeenCalledOnceWith({
datasetId: TEST_DATASET_ID,
event: TEST_EVENT_CONTENT,
});
expectNavigatedToDatasetOverview();
expectRequestedDatasetMainData();
}));

it("should check commitEventToDataset() method with error", fakeAsync(() => {
const errorCommitEventChangesSpy = spyOn(
service,
"errorCommitEventChanges",
);
spyOn(datasetApi, "commitEvent").and.returnValue(
const commitEventSpy = spyOn(datasetApi, "commitEvent").and.returnValue(
of(mockCommitEventToDatasetMutationError),
);
service
.commitEventToDataset(
TEST_ACCOUNT_NAME,
TEST_DATASET_NAME,
"contentEvent",
)
.subscribe(() => {
expect(errorCommitEventChangesSpy).toHaveBeenCalledTimes(1);
tick();
});

const errorSubscription$: Subscription =
commitService.onErrorCommitEventChanges
.pipe(first())
.subscribe((message) => {
expect(message).toEqual(
mockCommitEventToDatasetMutationErrorMessage,
);
});

requestCommitEvent().subscribe(() => {
tick();
});
flush();

expect(commitEventSpy).toHaveBeenCalledOnceWith({
datasetId: TEST_DATASET_ID,
event: TEST_EVENT_CONTENT,
});
expect(navigationServiceSpy).not.toHaveBeenCalled();
expect(requestDatasetMainDataSpy).not.toHaveBeenCalled();

// If error triggered, our subscription will be closed
expect(errorSubscription$.closed).toBeTrue();
}));

it("should check updateReadme() method ", fakeAsync(() => {
const navigationServiceSpy = spyOn(
navigationService,
"navigateToDatasetView",
);
spyOn(datasetApi, "updateReadme").and.returnValue(
of(mockUpdateReadmeMutation),
);
service
.updateReadme(
TEST_ACCOUNT_NAME,
TEST_DATASET_NAME,
"readme content",
)
const updateReadmeSpy = spyOn(
datasetApi,
"updateReadme",
).and.returnValue(of(mockUpdateReadmeMutation));
const README_CONTENT = "readme content";

commitService
.updateReadme(TEST_ACCOUNT_NAME, TEST_DATASET_NAME, README_CONTENT)
.subscribe(() => {
expect(navigationServiceSpy).toHaveBeenCalledTimes(1);
tick();
});
flush();

expect(updateReadmeSpy).toHaveBeenCalledOnceWith(
TEST_DATASET_ID,
README_CONTENT,
);
expectNavigatedToDatasetOverview();
expectRequestedDatasetMainData();
}));
});
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ export class DatasetCommitService {
datasetName,
})
.subscribe();

this.navigationService.navigateToDatasetView({
accountName,
datasetName,
Expand Down

0 comments on commit c824cde

Please sign in to comment.