1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { LinkService } from "../link-service/link-service";
6 import { GroupsService, GroupContentsResource } from "../groups-service/groups-service";
7 import { FavoriteService } from "./favorite-service";
8 import { LinkClass, LinkResource } from "../../models/link";
9 import { mockResourceService } from "../../common/api/common-resource-service.test";
10 import { FilterBuilder } from "../../common/api/filter-builder";
12 describe("FavoriteService", () => {
14 let linkService: LinkService;
15 let groupService: GroupsService;
18 linkService = mockResourceService(LinkService);
19 groupService = mockResourceService(GroupsService);
22 it("marks resource as favorite", async () => {
23 linkService.create = jest.fn().mockReturnValue(Promise.resolve({ uuid: "newUuid" }));
24 const favoriteService = new FavoriteService(linkService, groupService);
26 const newFavorite = await favoriteService.create({ userUuid: "userUuid", resource: { uuid: "resourceUuid", name: "resource" } });
28 expect(linkService.create).toHaveBeenCalledWith({
29 ownerUuid: "userUuid",
31 headUuid: "resourceUuid",
32 linkClass: LinkClass.STAR,
35 expect(newFavorite.uuid).toEqual("newUuid");
39 it("unmarks resource as favorite", async () => {
40 const list = jest.fn().mockReturnValue(Promise.resolve({ items: [{ uuid: "linkUuid" }] }));
41 const filters = FilterBuilder
43 .addEqual('tailUuid', "userUuid")
44 .addEqual('headUuid', "resourceUuid")
45 .addEqual('linkClass', LinkClass.STAR);
46 linkService.list = list;
47 linkService.delete = jest.fn().mockReturnValue(Promise.resolve({ uuid: "linkUuid" }));
48 const favoriteService = new FavoriteService(linkService, groupService);
50 const newFavorite = await favoriteService.delete({ userUuid: "userUuid", resourceUuid: "resourceUuid" });
52 expect(list.mock.calls[0][0].filters.getFilters()).toEqual(filters.getFilters());
53 expect(linkService.delete).toHaveBeenCalledWith("linkUuid");
54 expect(newFavorite[0].uuid).toEqual("linkUuid");
57 it("lists favorite resources", async () => {
58 const list = jest.fn().mockReturnValue(Promise.resolve({ items: [{ headUuid: "headUuid" }] }));
59 const listFilters = FilterBuilder
61 .addEqual('tailUuid', "userUuid")
62 .addEqual('linkClass', LinkClass.STAR);
63 const contents = jest.fn().mockReturnValue(Promise.resolve({ items: [{ uuid: "resourceUuid" }] }));
64 const contentFilters = FilterBuilder.create().addIn('uuid', ["headUuid"]);
65 linkService.list = list;
66 groupService.contents = contents;
67 const favoriteService = new FavoriteService(linkService, groupService);
69 const favorites = await favoriteService.list("userUuid");
71 expect(list.mock.calls[0][0].filters.getFilters()).toEqual(listFilters.getFilters());
72 expect(contents.mock.calls[0][0]).toEqual("userUuid");
73 expect(contents.mock.calls[0][1].filters.getFilters()).toEqual(contentFilters.getFilters());
74 expect(favorites).toEqual({ items: [{ uuid: "resourceUuid" }] });
77 it("checks if resources are present in favorites", async () => {
78 const list = jest.fn().mockReturnValue(Promise.resolve({ items: [{ headUuid: "foo" }] }));
79 const listFilters = FilterBuilder
81 .addIn("headUuid", ["foo", "oof"])
82 .addEqual("tailUuid", "userUuid")
83 .addEqual("linkClass", LinkClass.STAR);
84 linkService.list = list;
85 const favoriteService = new FavoriteService(linkService, groupService);
87 const favorites = await favoriteService.checkPresenceInFavorites("userUuid", ["foo", "oof"]);
89 expect(list.mock.calls[0][0].filters.getFilters()).toEqual(listFilters.getFilters());
90 expect(favorites).toEqual({ foo: true, oof: false });