Create util for mocking resource services, create tests for FavoriteService
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Mon, 23 Jul 2018 14:56:48 +0000 (16:56 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Mon, 23 Jul 2018 14:56:48 +0000 (16:56 +0200)
Feature #13840

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

src/common/api/common-resource-service.test.ts
src/services/favorite-service/favorite-service.test.ts [new file with mode: 0644]

index 8346624550edc4af8149ab81c0838eb02405a640..d909c092aa8bad0a37ac0308a4da8ca80a872585 100644 (file)
@@ -3,8 +3,17 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import { CommonResourceService } from "./common-resource-service";
-import axios from "axios";
+import axios, { AxiosInstance } from "axios";
 import MockAdapter from "axios-mock-adapter";
+import { Resource } from "../../models/resource";
+
+export const mockResourceService = <R extends Resource, C extends CommonResourceService<R>>(Service: new (client: AxiosInstance) => C) => {
+    const axiosInstance = axios.create();
+    const axiosMock = new MockAdapter(axiosInstance);
+    const service = new Service(axiosInstance);
+    Object.keys(service).map(key => service[key] = jest.fn());
+    return service;
+};
 
 describe("CommonResourceService", () => {
     const axiosInstance = axios.create();
diff --git a/src/services/favorite-service/favorite-service.test.ts b/src/services/favorite-service/favorite-service.test.ts
new file mode 100644 (file)
index 0000000..7e74b52
--- /dev/null
@@ -0,0 +1,77 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { LinkService } from "../link-service/link-service";
+import { GroupsService, GroupContentsResource } from "../groups-service/groups-service";
+import { FavoriteService } from "./favorite-service";
+import { LinkClass, LinkResource } from "../../models/link";
+import { mockResourceService } from "../../common/api/common-resource-service.test";
+import { FilterBuilder } from "../../common/api/filter-builder";
+
+describe("FavoriteService", () => {
+
+    let linkService: LinkService;
+    let groupService: GroupsService;
+
+    beforeEach(() => {
+        linkService = mockResourceService(LinkService);
+        groupService = mockResourceService(GroupsService);
+    });
+
+    it("marks resource as favorite", async () => {
+        linkService.create = jest.fn().mockReturnValue(Promise.resolve({ uuid: "newUuid" }));
+        const favoriteService = new FavoriteService(linkService, groupService);
+
+        const newFavorite = await favoriteService.create({ userUuid: "userUuid", resourceUuid: "resourceUuid" });
+
+        expect(linkService.create).toHaveBeenCalledWith({
+            ownerUuid: "userUuid",
+            tailUuid: "userUuid",
+            headUuid: "resourceUuid",
+            linkClass: LinkClass.STAR,
+            name: "resourceUuid"
+        });
+        expect(newFavorite.uuid).toEqual("newUuid");
+
+    });
+
+    it("unmarks resource as favorite", async () => {
+        const list = jest.fn().mockReturnValue(Promise.resolve({ items: [{ uuid: "linkUuid" }] }));
+        const filters = FilterBuilder
+            .create<LinkResource>()
+            .addEqual('tailUuid', "userUuid")
+            .addEqual('headUuid', "resourceUuid")
+            .addEqual('linkClass', LinkClass.STAR);
+        linkService.list = list;
+        linkService.delete = jest.fn().mockReturnValue(Promise.resolve({ uuid: "linkUuid" }));
+        const favoriteService = new FavoriteService(linkService, groupService);
+
+        const newFavorite = await favoriteService.delete({ userUuid: "userUuid", resourceUuid: "resourceUuid" });
+
+        expect(list.mock.calls[0][0].filters.getFilters()).toEqual(filters.getFilters());
+        expect(linkService.delete).toHaveBeenCalledWith("linkUuid");
+        expect(newFavorite[0].uuid).toEqual("linkUuid");
+    });
+
+    it("lists favorite resources", async () => {
+        const list = jest.fn().mockReturnValue(Promise.resolve({ items: [{ headUuid: "headUuid" }] }));
+        const listFilters = FilterBuilder
+            .create<LinkResource>()
+            .addEqual('tailUuid', "userUuid")
+            .addEqual('linkClass', LinkClass.STAR);
+        const contents = jest.fn().mockReturnValue(Promise.resolve({ items: [{ uuid: "resourceUuid" }] }));
+        const contentFilters = FilterBuilder.create<GroupContentsResource>().addIn('uuid', ["headUuid"]);
+        linkService.list = list;
+        groupService.contents = contents;
+        const favoriteService = new FavoriteService(linkService, groupService);
+
+        const favorites = await favoriteService.list("userUuid");
+
+        expect(list.mock.calls[0][0].filters.getFilters()).toEqual(listFilters.getFilters());
+        expect(contents.mock.calls[0][0]).toEqual("userUuid");
+        expect(contents.mock.calls[0][1].filters.getFilters()).toEqual(contentFilters.getFilters());
+        expect(favorites).toEqual({ items: [{ uuid: "resourceUuid" }] });
+    });
+
+});