diff --git a/src/components/UserProfileComponents/UserItems.vue b/src/components/UserProfileComponents/UserItems.vue index be1cc0457ac6caa220b9c8afedc467ae143d8585..53cacdd2751b93ab3323097fa641a1f5dedcaf92 100644 --- a/src/components/UserProfileComponents/UserItems.vue +++ b/src/components/UserProfileComponents/UserItems.vue @@ -65,7 +65,7 @@ @click=" this.$router.push('/item/' + item.listingID + '/edit') " - class="block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" + class="editButton block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" > Rediger gjenstand </button> @@ -73,7 +73,7 @@ <li> <button @click="goToDeleteItem(item.listingID)" - class="block py-2 px-4 text-sm text-error-medium hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" + class="deleteButton block py-2 px-4 text-sm text-error-medium hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" > Slett gjenstand </button> @@ -102,7 +102,7 @@ id="confirmDeleteButton1" @click="deleteItem" :text="'Slett'" - class="m-2 bg-error-medium" + class="confirmDelete m-2 bg-error-medium" > </ColoredButton> </div> @@ -170,7 +170,7 @@ > <div class="flex justify-center p-2"> <ColoredButton - id="#cancelDeleteButton" + id="cancelDeleteButton" :text="'Avbryt'" @click="cancelDelete" class="bg-gray-500 m-2" @@ -202,14 +202,14 @@ </template> <script> import TripleDotButton from "@/components/BaseComponents/TripleDotButton.vue"; -import { GetUserListings, getItemPictures } from "@/utils/apiutil"; import ColoredButton from "@/components/BaseComponents/ColoredButton.vue"; - -import UserService from "@/services/user.service"; import ItemCard from "@/components/ItemComponents/ItemCard.vue"; import PaginationTemplate from "@/components/BaseComponents/PaginationTemplate"; import CustomFooterModal from "@/components/BaseComponents/CustomFooterModal.vue"; +import UserService from "@/services/user.service"; +import listingService from "@/services/listing.service"; + export default { name: "UserItems", components: { @@ -272,10 +272,12 @@ export default { } }, getUserListingsFromAPI: async function () { - this.items = await GetUserListings(); + this.items = await UserService.getUserListings(); for (var i = 0; i < this.items.length; i++) { this.items[i].toggle = false; - let images = await getItemPictures(this.items[i].listingID); + let images = await listingService.getItemPictures( + this.items[i].listingID + ); if (images.length > 0) { this.items[i].img = images[0].picture; } diff --git a/tests/unit/component-tests/user-component-tests/__snapshots__/user-items.spec.js.snap b/tests/unit/component-tests/user-component-tests/__snapshots__/user-items.spec.js.snap index 6144f610a8902c6c981d2d5ace4425fdd3cec20d..344d5b6abc9dc0050a300001c685640d62b2a39f 100644 --- a/tests/unit/component-tests/user-component-tests/__snapshots__/user-items.spec.js.snap +++ b/tests/unit/component-tests/user-component-tests/__snapshots__/user-items.spec.js.snap @@ -54,6 +54,105 @@ exports[`UserItems component renders correctly 1`] = ` class="grid grid-flow-row-dense grid-cols-2 md:grid-cols-4 lg:grid-cols-5 w-full" > + <div + class="cardContainer" + id="item" + > + <div + class="w-full" + > + + <!-- Item card, displays title, address, price per day and a picture --> + <div + class="mt-5 px-5 ItemCard w-full h-full" + id="ItemCardPage" + > + <div + class="w-full h-full rounded bg-gray-100 ring-1 ring-gray-200 overflow-hidden display:inline-block correct-size cursor-pointer" + > + <div + class="relative h-0 pb-[66.7%]" + > + <img + alt="Item image" + class="w-full h-full object-contain absolute" + src="" + /> + </div> + <div + class="p-1 m-1 bottom-0" + > + <p + class="font-bold text-sm" + id="title" + > + Matboks + </p> + <p + class="text-gray-700 text-xs" + id="price" + > + 50 kr + </p> + <p + class="text-gray-700 text-xs font-bold" + id="adress" + > + Veien + </p> + </div> + </div> + </div> + + </div> + <!-- Dropdown menu with options for editing an item and deleting an item --> + <button + class="w-10 h-10 text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg float-right text-sm p-1.5 DotButton" + data-dropdown-toggle="dropdown" + id="dropdownDefault" + type="button" + > + <svg + aria-hidden="true" + class="w-6 h-6" + fill="none" + stroke="currentColor" + stroke-width="2" + viewBox="0 0 24 24" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z" + stroke-linecap="round" + stroke-linejoin="round" + /> + </svg> + </button> + <div + class="options z-10 w-44 text-base list-none bg-white rounded divide-y divide-gray-100 shadow dark:bg-gray-700 pt-4 pl-12" + style="display: none;" + > + <ul + aria-labelledby="dropdownDefault" + class="py-1 absolute bg-white ring-1 ring-gray-300 rounded-xl" + > + <li> + <button + class="editButton block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" + > + Rediger gjenstand + </button> + </li> + <li> + <button + class="deleteButton block py-2 px-4 text-sm text-error-medium hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" + > + Slett gjenstand + </button> + </li> + </ul> + </div> + </div> <!-- A waring asking the user if it is sure it wants to delete the item with options to go ahead with the deleting or to cancel the delete. --> diff --git a/tests/unit/component-tests/user-component-tests/user-items.spec.js b/tests/unit/component-tests/user-component-tests/user-items.spec.js index 7640696dee98524a786e6f059aa1520e6934a429..b077c14482cad1d98a076ab88a5bf6afcf6a5cea 100644 --- a/tests/unit/component-tests/user-component-tests/user-items.spec.js +++ b/tests/unit/component-tests/user-component-tests/user-items.spec.js @@ -1,23 +1,59 @@ import { mount } from "@vue/test-utils"; import UserItems from "@/components/UserProfileComponents/UserItems.vue"; +import UserService from "@/services/user.service"; +import ListingService from "@/services/listing.service"; + +jest.mock("@/services/user.service", () => jest.fn()); +jest.mock("@/services/listing.service", () => jest.fn()); + +UserService.getUserListings = jest.fn(() => { + return new Promise((resolve) => { + resolve([ + { + listingID: 1, + img: "", + address: "Veien", + title: "Matboks", + pricePerDay: 50, + toggle: false, + }, + ]); + }); +}); + +UserService.setListingToDeleted = jest.fn(() => { + return new Promise((resolve) => { + resolve(); + }); +}); + +ListingService.getItemPictures = jest.fn(() => { + return new Promise((resolve) => { + resolve([]); + }); +}); + +jest.mock("axios"); + +let mockRouter; +let wrapper; describe("UserItems component", () => { - let wrapper; + mockRouter = { + push: jest.fn(), + go: jest.fn(), + }; beforeEach(() => { wrapper = mount(UserItems, { + global: { + mocks: { + $router: mockRouter, + }, + }, data() { return { - items: [ - { - listingID: 1, - img: "", - address: "Veien", - title: "Matboks", - pricePerDay: 50, - toggle: false, - }, - ], + showItems: true, }; }, }); @@ -34,4 +70,36 @@ describe("UserItems component", () => { it("Check headline", () => { expect(wrapper.find("#headline").text()).toMatch("Mine gjenstander"); }); + + it("Check if pressing 'Rediger gjenstand' pushes to right path", async () => { + const dotButton = wrapper.findAll(".DotButton")[0]; + dotButton.trigger("click"); + const editButton = wrapper.findAll(".editButton")[0]; + expect(editButton.text()).toBe("Rediger gjenstand"); + editButton.trigger("click"); + await wrapper.vm.$nextTick(); + expect(mockRouter.push).toBeCalled(); + expect(mockRouter.push).toBeCalledWith("/item/1/edit"); + }); + + it("Check if delete is called", async () => { + const dotButton = wrapper.findAll(".DotButton")[0]; + dotButton.trigger("click"); + await wrapper.vm.$nextTick(); + + const deleteButton = wrapper.findAll(".deleteButton")[0]; + expect(deleteButton.text()).toBe("Slett gjenstand"); + deleteButton.trigger("click"); + await wrapper.vm.$nextTick(); + + const confirmButton = wrapper.findAll(".confirmDelete")[0]; + expect(confirmButton.text()).toBe("Slett"); + + //Feiler herfra + confirmButton.trigger("click"); + await wrapper.vm.$nextTick(); + + expect(ListingService.getItemPictures).toBeCalled(); + expect(mockRouter.go).toBeCalled(); + }); });