From d10f7421565842a1ead05c5c078c13e54220ad8a Mon Sep 17 00:00:00 2001
From: Ingrid Martinsheimen Egge <ingrimeg@stud.ntnu.no>
Date: Mon, 1 May 2023 11:59:51 +0200
Subject: [PATCH] la inn tester for fridgeView og FridgeItemModal

---
 package-lock.json                             | 40 +++++++++
 package.json                                  |  1 +
 src/components/EatFridgeItemModal.vue         |  2 +-
 src/components/Navbar.vue                     |  1 +
 .../__tests__/FridgeItemModal.spec.js         | 88 +++++++++++++++++++
 src/components/__tests__/ItemSearch.spec.js   |  6 +-
 src/components/__tests__/Navbar.spec.js       |  2 +
 src/views/FridgeView.vue                      |  3 -
 src/views/__tests__/FridgeView.spec.js        | 70 +++++++++++++++
 9 files changed, 206 insertions(+), 7 deletions(-)
 create mode 100644 src/components/__tests__/FridgeItemModal.spec.js
 create mode 100644 src/views/__tests__/FridgeView.spec.js

diff --git a/package-lock.json b/package-lock.json
index 4f041b3..325009f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,6 +9,7 @@
       "version": "0.0.0",
       "dependencies": {
         "@iconify/vue": "^4.1.1",
+        "@pinia/testing": "^0.0.16",
         "jwt-decode": "^3.1.2",
         "pinia": "^2.0.35",
         "pinia-plugin-persistedstate": "^3.1.0",
@@ -683,6 +684,45 @@
         "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
+    "node_modules/@pinia/testing": {
+      "version": "0.0.16",
+      "resolved": "https://registry.npmjs.org/@pinia/testing/-/testing-0.0.16.tgz",
+      "integrity": "sha512-oa5kO82hzWekqMq1HTnS/b+ZM+ZKEcEApuuCTelvKK79jTxg7P026Qw8/2RbVn5eUGAvRWQu4ubObrshVqCRjQ==",
+      "dependencies": {
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "pinia": ">=2.0.34"
+      }
+    },
+    "node_modules/@pinia/testing/node_modules/vue-demi": {
+      "version": "0.14.0",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz",
+      "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@sideway/address": {
       "version": "4.1.4",
       "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
diff --git a/package.json b/package.json
index 61bff41..0eb0aa1 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
   },
   "dependencies": {
     "@iconify/vue": "^4.1.1",
+    "@pinia/testing": "^0.0.16",
     "jwt-decode": "^3.1.2",
     "pinia": "^2.0.35",
     "pinia-plugin-persistedstate": "^3.1.0",
diff --git a/src/components/EatFridgeItemModal.vue b/src/components/EatFridgeItemModal.vue
index f3e6150..2d33835 100644
--- a/src/components/EatFridgeItemModal.vue
+++ b/src/components/EatFridgeItemModal.vue
@@ -3,7 +3,7 @@
       <div id="exitBtn" @click="close"><Icon  icon="mdi:alpha-x-box" :color="redIconColor" :style="{ fontSize: redIconSize }" /></div>
 
       <h2>{{ this.fridgeItem.item.name }}</h2>
-      <p>{{sliderValue}} {{this.fridgeItem.amount.unit}}</p>
+      <p id="sliderDisplay">{{sliderValue}} {{this.fridgeItem.amount.unit}}</p>
       <label for="slider">Mengde tatt av varen:</label>
 
       <input type = "range" id = "slider" name = "slider" min="0" :max = "this.maxValue" v-model="sliderValue">
diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue
index e597f86..788592a 100644
--- a/src/components/Navbar.vue
+++ b/src/components/Navbar.vue
@@ -34,6 +34,7 @@
 <script>
 import { Icon } from '@iconify/vue';
 import Logo from "@/components/Logo.vue";
+import { RouterLink } from 'vue-router'
 
 export default {
     name: "Navbar",
diff --git a/src/components/__tests__/FridgeItemModal.spec.js b/src/components/__tests__/FridgeItemModal.spec.js
new file mode 100644
index 0000000..cc180e0
--- /dev/null
+++ b/src/components/__tests__/FridgeItemModal.spec.js
@@ -0,0 +1,88 @@
+import { describe, it, expect } from 'vitest'
+import { mount } from '@vue/test-utils'
+import EatFridgeItemModal from "@/components/EatFridgeItemModal.vue";
+
+const normalItem = {
+    "item":{
+        "id": "1",
+        "name":"purre",
+        "amount": {"quantity": "500","unit": "g"},
+        "image_url": "https://bilder.ngdata.no/7040512550818/meny/large.jpg"
+    },
+    "exp_date": "2222-02-22T00:00:00+00:00",
+    "amount": {"quantity": "500","unit": "g"}
+}
+
+const expiredItem = {
+    "item":{
+        "id": "1",
+        "name":"purre",
+        "amount": {"quantity": "500","unit": "g"},
+        "image_url": "https://bilder.ngdata.no/7040512550818/meny/large.jpg"
+    },
+    "exp_date": "2002-02-22T00:00:00+00:00",
+    "amount": {"quantity": "500","unit": "g"}
+}
+describe('Renders correctly', () => {
+    it('displays the name of the item', () => {
+        const wrapper = mount(EatFridgeItemModal, {
+            props: {
+                fridgeItem: normalItem,
+            },
+        });
+
+        const itemName = wrapper.find('h2')
+        expect(itemName.text()).toContain('purre')
+
+    });
+
+    it('displays the correct unit', () => {
+        const wrapper = mount(EatFridgeItemModal, {
+            props: {
+                fridgeItem: normalItem,
+            },
+        });
+
+        const sliderValueUnit = wrapper.find('#sliderDisplay')
+        expect(sliderValueUnit.text()).toContain('g')
+
+    });
+
+    it('Displays a message if item has expired', () => {
+        const wrapper = mount(EatFridgeItemModal, {
+            props: {
+                fridgeItem: expiredItem,
+            },
+        });
+
+        expect(wrapper.find('#itemHasExpiredMessage').exists()).toBe(true);
+        const expiredMsgBox = wrapper.find('#itemHasExpiredMessage')
+        expect(expiredMsgBox.isVisible()).toBe(true)
+
+    });
+
+    it('Does not display message if item has not expired', () => {
+        const wrapper = mount(EatFridgeItemModal, {
+            props: {
+                fridgeItem: normalItem,
+            },
+        });
+        expect(wrapper.find('#itemHasExpiredMessage').exists()).toBe(false);
+    });
+
+})
+
+describe('Behaves correctly', () => {
+    it('emits close when X is pressed', async () => {
+        const wrapper = mount(EatFridgeItemModal, {
+            props: {
+                fridgeItem: normalItem,
+            },
+        });
+
+        await wrapper.find('#exitBtn').trigger('click');
+        await wrapper.vm.$nextTick();
+        expect(wrapper.emitted().closeModal).toBeTruthy();
+
+    });
+})
\ No newline at end of file
diff --git a/src/components/__tests__/ItemSearch.spec.js b/src/components/__tests__/ItemSearch.spec.js
index 12d1120..49c6597 100644
--- a/src/components/__tests__/ItemSearch.spec.js
+++ b/src/components/__tests__/ItemSearch.spec.js
@@ -19,7 +19,7 @@ const SearchReturn = [
     }];
 
 describe('Behaves as expected', () => {
-    it('shows correct number of results', async () => {
+    it('shows correct number of results', () => {
         const wrapper = mount(ItemSearch, {
             data() {
                 return {
@@ -34,7 +34,7 @@ describe('Behaves as expected', () => {
         expect(wrapper.text()).toContain('(2)')
     });
 
-    it('When adding more items, the total ingredient amount is shown', async () => {
+    it('When adding more items, the total ingredient amount is shown', () => {
         const wrapper = mount(ItemSearch, {
             data() {
                 return {
@@ -51,7 +51,7 @@ describe('Behaves as expected', () => {
         expect(totalItemCount.text()).toContain('stk')
     });
 
-    it('Selected contains all items ', async () => {
+    it('Select contains all items ', () => {
         const wrapper = mount(ItemSearch, {
             data() {
                 return {
diff --git a/src/components/__tests__/Navbar.spec.js b/src/components/__tests__/Navbar.spec.js
index a212573..86579bf 100644
--- a/src/components/__tests__/Navbar.spec.js
+++ b/src/components/__tests__/Navbar.spec.js
@@ -3,6 +3,8 @@ import { describe, it, expect } from 'vitest'
 import { mount } from '@vue/test-utils'
 import Navbar from "@/components/Navbar.vue";
 import { Icon } from '@iconify/vue';
+import { RouterLink } from 'vue-router';
+
 describe('Navbar', () => {
     it('contains 5 links', () => {
         const wrapper = mount(Navbar)
diff --git a/src/views/FridgeView.vue b/src/views/FridgeView.vue
index 958ffd6..1428ae7 100644
--- a/src/views/FridgeView.vue
+++ b/src/views/FridgeView.vue
@@ -135,7 +135,4 @@ h1 {
   font-weight: bolder;
   font-size: 1.2em;
 }
-
-
-
 </style>
\ No newline at end of file
diff --git a/src/views/__tests__/FridgeView.spec.js b/src/views/__tests__/FridgeView.spec.js
new file mode 100644
index 0000000..4790f4a
--- /dev/null
+++ b/src/views/__tests__/FridgeView.spec.js
@@ -0,0 +1,70 @@
+import { describe, it, expect, vi } from 'vitest'
+import { createTestingPinia } from '@pinia/testing'
+import { mount } from '@vue/test-utils'
+import FridgeView from "@/views/FridgeView.vue";
+
+
+const fridgeIngredients = [
+    {
+        "item":{
+            "id": "1",
+            "name":"eple",
+            "amount": {"quantity": "4","unit": "stk"},
+            "image_url": "https://bilder.ngdata.no/7040512550818/meny/large.jpg"
+        },
+        "exp_date": "2222-02-22T00:00:00+00:00",
+        "amount": {"quantity": "6","unit": "stk"}
+    }];
+
+describe('Fridge', () => {
+    it('renders', () => {
+        const wrapper = mount(FridgeView, {
+            global: {
+                plugins: [createTestingPinia({
+                    createSpy: vi.fn,
+                })],
+            },
+        })
+        expect(wrapper.text()).toContain('Kjøleskap')
+    });
+
+    it('pressing the plus button makes search visible', async () => {
+        const wrapper = mount(FridgeView, {
+            global: {
+                plugins: [createTestingPinia({
+                    createSpy: vi.fn,
+                })],
+            },
+
+        })
+        expect(wrapper.find('ItemSearch').exists()).toBe(false);
+        await wrapper.find('#addItemBtn').trigger('click');
+
+        setTimeout(() => {
+            expect(wrapper.find('ItemSearch').exists()).toBe(true);
+        }, 1000);
+    });
+
+    it('when appleBtnEmit, the EatFridgeItemModal is displayed', () => {
+        const wrapper = mount(FridgeView, {
+            global: {
+                plugins: [createTestingPinia({
+                    createSpy: vi.fn,
+                })],
+            },
+            data() {
+                return {
+                    fridgeItems: fridgeIngredients,
+                };
+            },
+
+        })
+
+        expect(wrapper.find('eat-fridge-item-modal').exists()).toBe(false);
+
+        wrapper.find('#appleBtn').trigger('click');
+        setTimeout(() => {
+            expect(wrapper.find('eat-fridge-item-modal').exists()).toBe(true);
+        }, 1000);
+    })
+})
\ No newline at end of file
-- 
GitLab