Skip to content

Commit

Permalink
552 frontend unit tests rewritten
Browse files Browse the repository at this point in the history
  • Loading branch information
stanislawK committed Oct 18, 2023
1 parent a2970a3 commit f780403
Show file tree
Hide file tree
Showing 24 changed files with 953 additions and 1,872 deletions.
155 changes: 118 additions & 37 deletions frontend/jest/utils.js
Original file line number Diff line number Diff line change
@@ -1,78 +1,159 @@
import { mount as nativeMount, createLocalVue } from '@vue/test-utils';
import Vuetify from 'vuetify';
import { mount as nativeMount } from '@vue/test-utils';
import { vi } from 'vitest';
import { createVuetify } from 'vuetify';
import { createStore } from 'vuex';
import Vuex from 'vuex';
import * as components from 'vuetify/components';
import * as directives from 'vuetify/directives';
import HacknightWrapper from '../src/components/Dashboard/Hacknight/HacknightWrapper.vue';
import HacknightsParticipants from '../src/components/Dashboard/HacknightsParticipants/HacknightsParticipants.vue';
import DashboardHeader from '../src/components/Dashboard/Header/DashboardHeader.vue';
import ParticipantsSearch from '../src/components/Dashboard/Participants/ParticipantsSearch/ParticipantsSearch.vue';
import ParticipantsList from '../src/components/Dashboard/Participants/ParticipantsList.vue';
import ParticipantsChart from '../src/components/Dashboard/ParticipantsChart/ParticipantsChart.vue';
import DashboardMain from '../src/components/Dashboard/DashboardMain.vue';
import AboutUs from '../src/components/HomePage/AboutUs/AboutUs.vue';
import ContactUs from '../src/components/HomePage/ContactUs/ContactUs.vue';
import HomePageHeader from '../src/components/HomePage/Header/HomePageHeader.vue';
import JoinUs from '../src/components/HomePage/JoinUs/JoinUs.vue';
import OurProjects from '../src/components/HomePage/OurProjects/OurProjects.vue';
import ModalContent from '../src/components/HomePage/OurProjects/ModalContent/ModalContent.vue';
import PageFooter from '../src/components/HomePage/PageFooter/PageFooter.vue';
import SocialMedia from '../src/components/HomePage/SocialMedia/SocialMedia.vue';
import HomePage from '../src/components/HomePage/HomePage.vue';
import LoginForm from '../src/components/Login/LoginForm.vue';

const storeObject = {
modules: {
hacknight: {
namespaced: true,
getters: {
getHacknights: jest.fn(() => []),
getHacknight: jest.fn(() => ({ participants: [] })),
getError: jest.fn()
getHacknights: vi.fn(() => []),
getHacknight: vi.fn(() => ({ participants: [] })),
getError: vi.fn(),
},
actions: { getHacknights: jest.fn() }
actions: { getHacknights: vi.fn() },
},
participant: {
namespaced: true,
getters: { getParticipants: jest.fn(() => []), getError: jest.fn() },
actions: { getParticipants: jest.fn() }
getters: { getParticipants: vi.fn(() => []), getError: vi.fn() },
actions: { getParticipants: vi.fn() },
},
auth: {
namespaced: true,
getters: { getError: jest.fn() }
getters: { getError: vi.fn() },
},
contact: {
namespaced: true,
getters: { successfullySent: jest.fn(), msgErrorRaised: jest.fn() }
}
}
getters: { successfullySent: vi.fn(), msgErrorRaised: vi.fn() },
},
},
};

// mount function from @vue/test-utils
// needs this enhancement to render vuetify components correctly
// source: https://vuetifyjs.com/en/getting-started/unit-testing/#mocking-vuetify

export const getMountWithVuetify = () => {
const localVue = createLocalVue();
const vuetify = new Vuetify();
const vuetify = createVuetify({
components,
directives,
});

return Component => {
return nativeMount(Component, { localVue, vuetify });
};
return nativeMount({
props: {},
global: {
components: {
HacknightWrapper,
HacknightsParticipants,
DashboardHeader,
ParticipantsSearch,
ParticipantsList,
ParticipantsChart,
DashboardMain,
AboutUs,
ContactUs,
HomePageHeader,
JoinUs,
OurProjects,
ModalContent,
PageFooter,
SocialMedia,
HomePage,
LoginForm,
},
plugins: [vuetify],
},
});
};

// mount function from @vue/test-utils
// needs this enhancement to render components using vuex correctly
// source: https://vue-test-utils.vuejs.org/guides/using-with-vuex.html

export const getMountWithVuex = () => {
const localVue = createLocalVue();
localVue.use(Vuex);
const store = createStore(storeObject);

return Component => {
const store = new Vuex.Store(storeObject);

return nativeMount(Component, { store, localVue, stubs: ['apexchart'] });
};
return nativeMount({
props: {},
global: {
components: {
HacknightWrapper,
HacknightsParticipants,
DashboardHeader,
ParticipantsSearch,
ParticipantsList,
ParticipantsChart,
DashboardMain,
AboutUs,
ContactUs,
HomePageHeader,
JoinUs,
OurProjects,
ModalContent,
PageFooter,
SocialMedia,
HomePage,
LoginForm,
},
plugins: [store],
},
});
};

// Use this function if you need to test a component
// that uses both Vuex and Vuetify

export const getMountWithProviders = () => {
const localVue = createLocalVue();
localVue.use(Vuex);
const vuetify = new Vuetify();

return Component => {
const store = new Vuex.Store(storeObject);
const store = createStore(storeObject);
const vuetify = createVuetify({
components,
directives,
});

return nativeMount(Component, {
store,
localVue,
vuetify,
stubs: ['apexchart']
});
};
return nativeMount({
props: {},
global: {
components: {
HacknightWrapper,
HacknightsParticipants,
DashboardHeader,
ParticipantsSearch,
ParticipantsList,
ParticipantsChart,
DashboardMain,
AboutUs,
ContactUs,
HomePageHeader,
JoinUs,
OurProjects,
ModalContent,
PageFooter,
SocialMedia,
HomePage,
LoginForm,
},
plugins: [store, vuetify],
},
});
};
33 changes: 17 additions & 16 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,54 +5,55 @@
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test": "vue-cli-service test:unit --collect-coverage",
"test": "vitest",
"test:watch": "vue-cli-service test:unit --watch",
"lint": "vue-cli-service lint --no-fix --max-warnings 0",
"lint:fix": "vue-cli-service lint "
},
"dependencies": {
"@mdi/font": "^7.2.96",
"@vuelidate/core": "^2.0.2",
"@vuelidate/validators": "^2.0.2",
"apexcharts": "^3.37.3",
"axios": "^1.3.5",
"eslint-plugin-jest": "^27.2.1",
"lodash": "^4.17.21",
"vue": "3.2.47",
"vue3-apexcharts": "^1.4.1",
"vue-gtag": "^2.0.1",
"vue-router": "^4.1.6",
"vue-scrollactive": "^0.9.3",
"@vuelidate/core": "^2.0.2",
"@vuelidate/validators": "^2.0.2",
"vue3-apexcharts": "^1.4.1",
"vuetify": "3.3.17",
"vuex": "^4.1.0",
"vue-gtag": "^2.0.1"
"vuex": "^4.1.0"
},
"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/eslint-parser": "^7.21.3",
"@vitejs/plugin-vue": "^4.3.4",
"@vue/babel-preset-app": "^5.0.8",
"@vue/cli-plugin-babel": "^5.0.8",
"@vue/cli-plugin-eslint": "^5.0.8",
"@vue/cli-plugin-unit-jest": "^5.0.8",
"@vue/cli-service": "^5.0.8",
"@vue/compiler-dom": "^3.2.47",
"@vue/compiler-sfc": "^3.2.47",
"@vue/test-utils": "^2.3.2",
"@vue/server-renderer": "^3.2.47",
"@vue/test-utils": "^2.4.1",
"eslint": "^8.38.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-vue": "^9.10.0",
"husky": "^8.0.3",
"jsdom": "^22.1.0",
"prettier": "^2.8.7",
"sass": "~1.32.12",
"sass-loader": "^13.2.2",
"style-loader": "^3.3.2",
"typescript": "^4.9.4",
"vite": "^4.4.9",
"vitest": "^0.34.6",
"webpack": "^5.75.0",
"webpack-plugin-vuetify": "^2.0.0",
"@babel/core": "^7.0.0",
"jest": "^27.1.0",
"@vue/compiler-dom": "^3.2.47",
"@vue/server-renderer": "^3.2.47",
"@vue/babel-preset-app": "^5.0.8",
"@babel/eslint-parser": "^7.21.3"

"webpack-plugin-vuetify": "^2.0.0"
},
"postcss": {
"plugins": {
Expand Down
24 changes: 16 additions & 8 deletions frontend/src/assets/projects.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
import volontuloImg from '../assets/images/volontulo.png';
import pahImg from '../assets/images/PAH.png';
import alinkaImg from '../assets/images/alinka.png';
import bankEmpatiiImg from '../assets/images/bank_empatii.png';
import streetmixImg from '../assets/images/streetmix.png';
import wysadzUliceImg from '../assets/images/wysadz_ulice.png';
import stronaSpolecznosciImg from '../assets/images/StronaSpolecznosci.png';
import watchDogImg from '../assets/images/watchdog.png';
const projects = [
{
badge: 'parked',
description:
'Portal Volontulo powstał dla ludzi i organizacji skupionych wokół idei pomocy innym poprzez udział we wolontariacie. Celem projektu jest pomoc we wzajemnym odnalezieniu się ludzi, którzy chcą realizować się jako wolontariusze/szki oraz organizacji i instytucji, które takich osób poszukują. Podział na strefę "Wolontariusza" oraz "Strefę organizacji i instytucji" umożliwa użytkownikom zwinną nawigację na stronie.',
githubLink: 'https://github.com/CodeForPoznan/volontulo',
imageAdress: require('@/assets/images/volontulo.png'),
imageAdress: volontuloImg,
licenseName: 'MIT',
licensePage: 'https://pl.wikipedia.org/wiki/Licencja_MIT',
name: 'Volontulo',
Expand All @@ -26,7 +34,7 @@ const projects = [
description:
'W wyniku współpracy z Polską Akcją Humanitarną stworzyliśmy aplikację pomagającą w logistycznych procesach akcji humanitarnych w różnych częściach globu. Aktualnie aplikacja służąca rejestracji i ewidencji przejazdów jest wykorzystywana podczas akcji humanitarnych na Ukrainie, w Sudanie Południowym, Jemenie oraz Somalii. Aplikacja pozwala także na eksport zebranych danych w celu ewidencji kosztów dla danej akcji humanitarnej. Dzięki temu możemy zoptymalizować proces i zmniejszyć nakład papierkowej pracy biurowej.',
githubLink: 'https://github.com/CodeForPoznan/pah-fm',
imageAdress: require('@/assets/images/PAH.png'),
imageAdress: pahImg,
license: 'MIT',
licensePage: 'https://github.com/CodeForPoznan/pah-fm/pull/401/files',
name: 'Fleet Manager',
Expand All @@ -53,7 +61,7 @@ const projects = [
description:
'Aplikacja Alinka powstała w celu optymalizacji codziennej pracy w poradniach psychologiczno-pedagogicznych. Jako byli pracownicy takiej poradni doskonale rozumiemy jakiego nakładu pracy wymaga wydanie orzeczenia czy sporządzenie protokołu z posiedzenia komisji. Aplikacja Alinka jest odpowiedzią na trudności, z jakimi spotykają się w codziennej pracy pracownicy administracji poradni. Nazwa aplikacji: „Alinka” to imię prawdziwej osoby, która musi wykonywać tę nudną, ale bardzo ważną pracę. Mamy nadzieję, że któregoś dnia ta aplikacja pomoże w jej pracy :).',
githubLink: 'https://github.com/CodeForPoznan/alinka-electron',
imageAdress: require('@/assets/images/alinka.png'),
imageAdress: alinkaImg,
license: 'MIT',
licensePage:
'https://github.com/CodeForPoznan/alinka-electron/blob/master/LICENSE',
Expand Down Expand Up @@ -89,7 +97,7 @@ const projects = [
description:
'Bank Empatii to projekt strony Patrycji Krawczyk, która zmaga się z białaczką limfoblastyczną i chce znaleźć dawcę komórek macierzystach o podobnym do Patrycji kodzie genetycznym. Trzy główne panele "Historia Patrycji", "Jak wygląda badanie? oraz "Gdzie się zgłosić?" kierują użytkowników strony do uzyskania informacji na temat jak zostać dawcą szpiku oraz czym jest Rejestr Dawców. Na stronie znajduje się mapa Polski z umiejscowieniem punktów poboru krwi.',
githubLink: 'https://github.com/CodeForPoznan/empatia',
imageAdress: require('@/assets/images/bank_empatii.png'),
imageAdress: bankEmpatiiImg,
license: 'MIT',
licensePage: 'https://github.com/CodeForPoznan/empatia/blob/master/LICENSE',
name: 'Bank Empatii',
Expand All @@ -102,7 +110,7 @@ const projects = [
description:
'Oryginalny Streetmix jest dziełem Code for America, które w 2013 roku podczas hacknightu postanowiło stworzyć narzędzie, które pomoże miejskim planistom w przedstawianiu koncepcji ich planu na rewitalizacje miejskiej przestrzeni. Najczęstszym rozwiązaniem po jakie sięgają planiści jest wykonanie makiet z papieru, które zwizualizują krajobraz. Tworząc internetową wersję tego działania, planiści mogą dotrzeć do szerszego grona odbiorców niż podczas samych spotkań, a także pozwolić członkom społeczności na dzielenie się i remiksowanie swoich dzieł. Jest to jeden z pierwszych naszych projektów, które mieliśmy przyjemność przetłumaczyć tak, aby można było wykorzystać te rozwiązanie na polskim gruncie.',
githubLink: 'https://github.com/CodeForPoznan/streetmix',
imageAdress: require('@/assets/images/streetmix.png'),
imageAdress: streetmixImg,
license: 'BSD 3-Clause',
licensePage:
'https://github.com/CodeForPoznan/streetmix/blob/master/LICENSE.md',
Expand All @@ -121,7 +129,7 @@ const projects = [
description:
'Wysadźulice.pl jest przykładem aplikacji umożliwiającej zaplanowanie czy zaprojektowanie przestrzeni, która nas otacza. Każdy użytkownik apliakcji ma dzięki niej realny wpływ na wygląd i funkcjonalność ulicy, przy której mieszka czy parku do którego chodzi. Wystraczy zrobić zdjęcie lub wgrać obraz z Google Street View, następnie dodać elementy w postaci: kwiatów, krzewów, drzew czy ławki. Tak przygotowana wizualizacja może posłużyć na konsultacjach z władzami miast czy gmin.',
githubLink: 'https://github.com/CodeForPoznan/wysadzulice.pl',
imageAdress: require('@/assets/images/wysadz_ulice.png'),
imageAdress: wysadzUliceImg,
license: 'MIT',
licensePage: 'https://pl.wikipedia.org/wiki/Licencja_MIT',
name: 'Wysadź ulicę',
Expand All @@ -134,7 +142,7 @@ const projects = [
description:
'Jest to trzecia wersja strony internetowej naszej organizacji. To pokazuje, że jako stowarzyszenie ciągle się rozwijamy i potrzebujemy nowych narzędzi i funkcjonalności do codziennej pracy. Aktualna forma strony jest wynikiem ponad 3 lat działalności jako Code for Poznań.',
githubLink: 'https://github.com/CodeForPoznan/codeforpoznan.pl_v3',
imageAdress: require('@/assets/images/StronaSpolecznosci.png'),
imageAdress: stronaSpolecznosciImg,
license: 'MIT',
licensePage:
'https://github.com/CodeForPoznan/codeforpoznan.pl_v3/blob/master/LICENSE',
Expand Down Expand Up @@ -165,7 +173,7 @@ const projects = [
description:
'Watchdog Polska od 2003 roku stoi na straży prawa do informacji. Rozumiane jest ono nie tylko jako warunek funkcjonowania dobrego państwa, ale przede wszystkim jako jedno z praw człowieka, które chroni ludzką godność, daje wolność wyrażania opinii i zabezpiecza przed nadużyciami władzy. W ciągu 17 lat swojej działalności Sieć Obywatelska Watchdog Polska uczestniczyła w około 1122 sprawach sądowych dotyczących prawa do informacji. Niektóre z nich miały przełomowe znaczenie dla społeczeństwa. Razem współtworzymy system służący do usprawnienia obiegu dokumentów Stowarzyszenia, w szczególności korespondencji sądowej.',
githubLink: 'https://github.com/watchdogpolska/small_eod',
imageAdress: require('@/assets/images/watchdog.png'),
imageAdress: watchDogImg,
license: 'MIT',
licensePage: 'https://github.com/CodeForPoznan/small_eod/blob/dev/LICENSE',
name: 'EOD',
Expand Down
5 changes: 3 additions & 2 deletions frontend/src/components/Dashboard/DashboardMain.spec.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import DashboardMain from './DashboardMain';
import DashboardMain from './DashboardMain.vue';
import { getMountWithProviders } from '../../../jest/utils';
import { expect, test, it } from 'vitest';

describe('DashboardMain component', () => {
test('DashboardMain component', () => {
const mountWithProviders = getMountWithProviders();

it('renders correctly', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import HacknightWrapper from './HacknightWrapper';
import HacknightWrapper from './HacknightWrapper.vue';
import { getMountWithProviders } from '../../../../jest/utils';
import { expect, test, it } from 'vitest';

describe('HacknightWrapper component', () => {
test('HacknightWrapper component', () => {
const mountWithProviders = getMountWithProviders();

it('renders correctly', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { getMountWithProviders } from '../../../../jest/utils';
import HacknightsParticipants from './HacknightsParticipants';
import HacknightsParticipants from './HacknightsParticipants.vue';
import { expect, test, it } from 'vitest';

describe('HacknightsParticipants component', () => {
test('HacknightsParticipants component', () => {
const mountWithProviders = getMountWithProviders();

it('renders correctly', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { shallowMount } from '@vue/test-utils';
import DashboardHeader from './DashboardHeader';
import DashboardHeader from './DashboardHeader.vue';
import { expect, test, it } from 'vitest';

describe('DashboardHeader component', () => {
test('DashboardHeader component', () => {
it('renders correctly', () => {
const wrapper = shallowMount(DashboardHeader);

Expand Down
Loading

0 comments on commit f780403

Please sign in to comment.