From 2e6a26a53eecd220c2a69c34f20695dd052cc208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=A4ser?= Date: Thu, 2 Feb 2023 09:01:36 +0100 Subject: [PATCH 1/3] test: enable basic unit tests --- .../header-auth/header-auth.module.scss | 7 ----- .../header-auth/header-auth.spec.tsx | 10 ------- .../components/header-auth/header-auth.tsx | 28 ------------------- .../website/components/header/header.spec.tsx | 20 +++++++++++-- apps/website/components/header/header.tsx | 13 ++++++--- .../website/components/layout/layout.spec.tsx | 15 ++++++++++ apps/website/pages/index.spec.tsx | 26 +++++++++++++++++ apps/website/specs/index.spec.tsx | 11 -------- 8 files changed, 68 insertions(+), 62 deletions(-) delete mode 100644 apps/website/components/header-auth/header-auth.module.scss delete mode 100644 apps/website/components/header-auth/header-auth.spec.tsx delete mode 100644 apps/website/components/header-auth/header-auth.tsx create mode 100644 apps/website/pages/index.spec.tsx delete mode 100644 apps/website/specs/index.spec.tsx diff --git a/apps/website/components/header-auth/header-auth.module.scss b/apps/website/components/header-auth/header-auth.module.scss deleted file mode 100644 index 45c2aa4..0000000 --- a/apps/website/components/header-auth/header-auth.module.scss +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Replace this with your own classes - * - * e.g. - * .container { - * } -*/ diff --git a/apps/website/components/header-auth/header-auth.spec.tsx b/apps/website/components/header-auth/header-auth.spec.tsx deleted file mode 100644 index 342329e..0000000 --- a/apps/website/components/header-auth/header-auth.spec.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { render } from '@testing-library/react'; - -import HeaderAuth from './header-auth'; - -describe('HeaderAuth', () => { - it('should render successfully', () => { - const { baseElement } = render(); - expect(baseElement).toBeTruthy(); - }); -}); diff --git a/apps/website/components/header-auth/header-auth.tsx b/apps/website/components/header-auth/header-auth.tsx deleted file mode 100644 index b2eb853..0000000 --- a/apps/website/components/header-auth/header-auth.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import styles from './header-auth.module.scss'; -import {useRouter} from "next/router"; - -export function HeaderAuth() { - const router = useRouter(); - - const goBack = (event) => { - router.back(); - } - - return ( - - ); -} - -export default HeaderAuth; diff --git a/apps/website/components/header/header.spec.tsx b/apps/website/components/header/header.spec.tsx index 3fd19ff..6a63192 100644 --- a/apps/website/components/header/header.spec.tsx +++ b/apps/website/components/header/header.spec.tsx @@ -1,10 +1,26 @@ -import { render } from '@testing-library/react'; +import {render} from '@testing-library/react'; +import {SessionProvider, useSession} from "next-auth/react"; import Header from './header'; +jest.mock("next-auth/react", () => { + const originalModule = jest.requireActual('next-auth/react'); + const mockSession = { + expires: new Date(Date.now() + 2 * 86400).toISOString(), + user: { username: "admin" } + }; + return { + __esModule: true, + ...originalModule, + useSession: jest.fn(() => { + return {data: mockSession, status: 'authenticated'} // return type is [] in v3 but changed to {} in v4 + }), + }; +}); + describe('Header', () => { it('should render successfully', () => { - const { baseElement } = render(
); + const {baseElement} = render(
); expect(baseElement).toBeTruthy(); }); }); diff --git a/apps/website/components/header/header.tsx b/apps/website/components/header/header.tsx index 874091b..ca53371 100644 --- a/apps/website/components/header/header.tsx +++ b/apps/website/components/header/header.tsx @@ -15,21 +15,26 @@ export function Header({items = []}) { if (session == null) { return; } - console.log(session); }, [session]); useEffect(function mount() { const menuButton = document.getElementById('menu-dropdown-button'); const menuZone = document.getElementById('menu-dropdown'); - new Dropdown(menuZone, menuButton); + if (menuButton && menuZone) { + new Dropdown(menuZone, menuButton); + } const userButton = document.getElementById('user-menu-button'); const userZone = document.getElementById('user-dropdown'); - new Dropdown(userZone, userButton); + if (userButton && userZone) { + new Dropdown(userZone, userButton); + } const burgerButton = document.getElementById('menu-button'); const megaZone = document.getElementById('navbar-dropdown'); - new Collapse(megaZone, burgerButton); + if (burgerButton && megaZone) { + new Collapse(megaZone, burgerButton); + } }); const renderGenerateItem = (item, index, isActive = false) => { diff --git a/apps/website/components/layout/layout.spec.tsx b/apps/website/components/layout/layout.spec.tsx index 56e3b81..5bb3c54 100644 --- a/apps/website/components/layout/layout.spec.tsx +++ b/apps/website/components/layout/layout.spec.tsx @@ -2,6 +2,21 @@ import { render } from '@testing-library/react'; import Layout from './layout'; +jest.mock("next-auth/react", () => { + const originalModule = jest.requireActual('next-auth/react'); + const mockSession = { + expires: new Date(Date.now() + 2 * 86400).toISOString(), + user: { username: "admin" } + }; + return { + __esModule: true, + ...originalModule, + useSession: jest.fn(() => { + return {data: mockSession, status: 'authenticated'} // return type is [] in v3 but changed to {} in v4 + }), + }; +}); + describe('Layout', () => { it('should render successfully', () => { const { baseElement } = render(); diff --git a/apps/website/pages/index.spec.tsx b/apps/website/pages/index.spec.tsx new file mode 100644 index 0000000..bf2a526 --- /dev/null +++ b/apps/website/pages/index.spec.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import {render} from '@testing-library/react'; + +import Index from '../pages/index'; + +jest.mock("next-auth/react", () => { + const originalModule = jest.requireActual('next-auth/react'); + const mockSession = { + expires: new Date(Date.now() + 2 * 86400).toISOString(), + user: {username: "admin"} + }; + return { + __esModule: true, + ...originalModule, + useSession: jest.fn(() => { + return {data: mockSession, status: 'authenticated'} // return type is [] in v3 but changed to {} in v4 + }), + }; +}); + +describe('Index', () => { + it('should render successfully', () => { + const {baseElement} = render(); + expect(baseElement).toBeTruthy(); + }); +}); diff --git a/apps/website/specs/index.spec.tsx b/apps/website/specs/index.spec.tsx deleted file mode 100644 index 42c9402..0000000 --- a/apps/website/specs/index.spec.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react'; - -import Index from '../pages/index'; - -describe('Index', () => { - it('should render successfully', () => { - const { baseElement } = render(); - expect(baseElement).toBeTruthy(); - }); -}); From 9ef38eec0061d14a07a0f0b1e16e4eed6876899a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=A4ser?= Date: Thu, 2 Feb 2023 11:49:35 +0100 Subject: [PATCH 2/3] test: active coverage from jest --- .dockers/sonarqube/docker-compose.yml | 20 ++++++++++++++++ .dockers/sonarqube/docker-compose1.yml | 21 +++++++++++++++++ .dockers/sonarqube/docker-compose2.yml | 23 +++++++++++++++++++ .../teamcity}/docker-compose.yml | 0 apps/website/jest.config.ts | 2 ++ apps/website/project.json | 3 +-- 6 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 .dockers/sonarqube/docker-compose.yml create mode 100644 .dockers/sonarqube/docker-compose1.yml create mode 100644 .dockers/sonarqube/docker-compose2.yml rename {teamcity => .dockers/teamcity}/docker-compose.yml (100%) diff --git a/.dockers/sonarqube/docker-compose.yml b/.dockers/sonarqube/docker-compose.yml new file mode 100644 index 0000000..ad3100f --- /dev/null +++ b/.dockers/sonarqube/docker-compose.yml @@ -0,0 +1,20 @@ +services: + + sonarqube-server: + image: sonarqube:lts-community + hostname: sonarqube + container_name: sonarqube + environment: + SONAR_JDBC_URL: jdbc:postgresql://192.168.1.33:5433/sonar + SONAR_JDBC_USERNAME: sonar + SONAR_JDBC_PASSWORD: sonarpwd + SONAR_SEARCH_JAVAADDITIONALOPTS: "-Dbootstrap.system_call_filter=false" + volumes: + - ./extensions:/opt/sonarqube/extensions + - ./logs:/opt/sonarqube/logs + ports: + - "9000:9000" + +networks: + soanrqube-networks: + driver: bridge diff --git a/.dockers/sonarqube/docker-compose1.yml b/.dockers/sonarqube/docker-compose1.yml new file mode 100644 index 0000000..7b72358 --- /dev/null +++ b/.dockers/sonarqube/docker-compose1.yml @@ -0,0 +1,21 @@ +services: + + sonarqube-server: + image: sonarqube:lts-community + hostname: sonarqube + container_name: sonarqube + environment: + SONAR_JDBC_URL: jdbc:postgresql://192.168.1.33:5433/sonar + SONAR_JDBC_USERNAME: sonar + SONAR_JDBC_PASSWORD: sonarpwd + SONAR_SEARCH_JAVAADDITIONALOPTS: "-Dbootstrap.system_call_filter=false" + volumes: + - ./data:/opt/sonarqube/data + - ./extensions:/opt/sonarqube/extensions + - ./logs:/opt/sonarqube/logs + ports: + - "9000:9000" + +networks: + soanrqube-networks: + driver: bridge diff --git a/.dockers/sonarqube/docker-compose2.yml b/.dockers/sonarqube/docker-compose2.yml new file mode 100644 index 0000000..1f513ff --- /dev/null +++ b/.dockers/sonarqube/docker-compose2.yml @@ -0,0 +1,23 @@ +services: + + sonarqube-server: + image: docker.io/bitnami/sonarqube:9 + hostname: sonarqube + container_name: sonarqube + environment: + SONARQUBE_DATABASE_HOST: 192.168.1.33 + SONARQUBE_DATABASE_PORT_NUMBER: 5433 + SONARQUBE_DATABASE_USER: sonar + SONARQUBE_DATABASE_NAME: sonar + SONARQUBE_DATABASE_PASSWORD: sonarpwd + SONAR_SEARCH_JAVAADDITIONALOPTS: "-Dbootstrap.system_call_filter=false" + volumes: + - ./data:/bitnami/sonarqube/data + - ./extensions:/bitnami/sonarqube/extensions + - ./logsé:/bitnami/sonarqube/logs + ports: + - "9000:9000" + +networks: + soanrqube-networks: + driver: bridge diff --git a/teamcity/docker-compose.yml b/.dockers/teamcity/docker-compose.yml similarity index 100% rename from teamcity/docker-compose.yml rename to .dockers/teamcity/docker-compose.yml diff --git a/apps/website/jest.config.ts b/apps/website/jest.config.ts index b71b9c6..26339d7 100644 --- a/apps/website/jest.config.ts +++ b/apps/website/jest.config.ts @@ -7,5 +7,7 @@ export default { '^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nrwl/next/babel'] }], }, moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + collectCoverage: true, + coverageReporters: ["clover", "json", "lcov", "text"], coverageDirectory: '../../coverage/apps/website', }; diff --git a/apps/website/project.json b/apps/website/project.json index 59fd0f5..35c2107 100644 --- a/apps/website/project.json +++ b/apps/website/project.json @@ -76,8 +76,7 @@ "{workspaceRoot}/coverage/{projectRoot}" ], "options": { - "jestConfig": "apps/website/jest.config.ts", - "passWithNoTests": true + "jestConfig": "apps/website/jest.config.ts" } }, "lint": { From 32d41899a02dde23da5ee8e81add3105cd29adc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=A4ser?= Date: Thu, 2 Feb 2023 11:55:17 +0100 Subject: [PATCH 3/3] test: add sonar-project.properties --- apps/website/sonar-project.properties | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 apps/website/sonar-project.properties diff --git a/apps/website/sonar-project.properties b/apps/website/sonar-project.properties new file mode 100644 index 0000000..c706ee5 --- /dev/null +++ b/apps/website/sonar-project.properties @@ -0,0 +1,8 @@ +sonar.projectKey=david:guitar-apps +sonar.sources=./ +sonar.coverage.exclusions=.next/,.eslintrc.json,config.ts,index.d.ts,jest.config.ts,next.config.js,postcss.config.js,tailwind.config.js,with-nx.js +sonar.language=ts +sonar.tests=./ +sonar.javascript.lcov.reportPaths=../../coverage/apps/website/lcov.info +sonar.testExecutionReportPaths=test-report.xml +sonar.sourceEncoding=UTF-8