From 4d33393f1719b9123e8975df2b46d18abda7a1e6 Mon Sep 17 00:00:00 2001
From: Albin Henriksson <albhe428@student.liu.se>
Date: Fri, 19 Feb 2021 09:14:04 +0100
Subject: [PATCH] Issue/7 add test coverage report

---
 .gitlab-ci.yml               |  1 +
 .gitlab/client.gitlab-ci.yml | 22 ++++++++++++++++++++++
 .gitlab/server.gitlab-ci.yml | 23 +++++++++++++++++++++++
 client/coverage_report.py    |  8 ++++++++
 client/package.json          |  6 +++++-
 server/app/api/admin.py      |  1 -
 server/app/api/users.py      | 13 +++++++------
 server/coverage_report.py    | 10 ++++++++++
 server/tests/__init__.py     |  1 -
 9 files changed, 76 insertions(+), 9 deletions(-)
 create mode 100644 client/coverage_report.py
 create mode 100644 server/coverage_report.py

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b724e32f..9e21e17a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,7 @@
 stages:
   - setup
   - test
+  - report
 
 include:
   - local: .gitlab/server.gitlab-ci.yml
diff --git a/.gitlab/client.gitlab-ci.yml b/.gitlab/client.gitlab-ci.yml
index 5313078a..61809ae3 100644
--- a/.gitlab/client.gitlab-ci.yml
+++ b/.gitlab/client.gitlab-ci.yml
@@ -51,3 +51,25 @@ client:test:
     - cd client
     - npm run test:coverage
   coverage: /All files\s*\|\s*([\d\.]+)/
+  artifacts:
+    paths:
+      - client/output/coverage/jest/cobertura-coverage.xml
+    expire_in: 5 min
+
+client:report:
+  image: python
+  stage: report
+  needs: ["client:test"]
+  only:
+    refs:
+      - dev
+      - merge_requests
+    changes:
+      - client/**/*
+  script:
+    - cd client
+    - python coverage_report.py
+  artifacts:
+    reports:
+      cobertura: client/output/coverage/jest/cobertura-coverage.xml
+    expire_in: 1 week
diff --git a/.gitlab/server.gitlab-ci.yml b/.gitlab/server.gitlab-ci.yml
index 5139e398..d735816f 100644
--- a/.gitlab/server.gitlab-ci.yml
+++ b/.gitlab/server.gitlab-ci.yml
@@ -38,3 +38,26 @@ server:test:
     - cd server
     - source env/bin/activate
     - pytest --cov app tests/
+    - coverage xml
+  artifacts:
+    paths:
+      - server/coverage.xml
+    expire_in: 5 min
+
+server:report:
+  image: python
+  stage: report
+  needs: ["server:test"]
+  only:
+    refs:
+      - dev
+      - merge_requests
+    changes:
+      - server/**/*
+  script:
+    - cd server
+    - python coverage_report.py
+  artifacts:
+    reports:
+      cobertura: server/coverage.xml
+    expire_in: 1 week
diff --git a/client/coverage_report.py b/client/coverage_report.py
new file mode 100644
index 00000000..c6cd3763
--- /dev/null
+++ b/client/coverage_report.py
@@ -0,0 +1,8 @@
+import xml.etree.ElementTree as et
+
+tree = et.parse('output/coverage/jest/cobertura-coverage.xml')
+root = tree.getroot()
+for package_class in tree.find('.//packages'):
+  package_class.set('name', 'client.' + package_class.attrib.get('name'))
+  package_class.set('filename', 'client/' + package_class.attrib.get('filename'))
+tree.write('output/coverage/jest/cobertura-coverage.xml')
diff --git a/client/package.json b/client/package.json
index deacb7c4..3116f7da 100644
--- a/client/package.json
+++ b/client/package.json
@@ -38,7 +38,7 @@
     "test": "react-scripts test",
     "eject": "react-scripts eject",
     "lint": "eslint \"./src/**/*.{js,ts,tsx}\"",
-    "test:coverage": "react-scripts test --coverage"
+    "test:coverage": "react-scripts test --coverage --coverageDirectory=output/coverage/jest"
   },
   "browserslist": {
     "production": [
@@ -57,6 +57,10 @@
       "src/**/*.{js,jsx,tsx,ts}",
       "!src/index.tsx",
       "!src/reportWebVitals.ts"
+    ],
+    "coverageReporters": [
+      "text",
+      "cobertura"
     ]
   },
   "proxy": "http://localhost:5000/api/"
diff --git a/server/app/api/admin.py b/server/app/api/admin.py
index ff077923..1d935910 100644
--- a/server/app/api/admin.py
+++ b/server/app/api/admin.py
@@ -6,5 +6,4 @@
 
 from flask import Blueprint
 
-
 admin_blueprint = Blueprint("admin", __name__)
diff --git a/server/app/api/users.py b/server/app/api/users.py
index 430b5407..db7859f2 100644
--- a/server/app/api/users.py
+++ b/server/app/api/users.py
@@ -1,17 +1,18 @@
 import datetime
+
+from app import db
+from app.api import api_blueprint
+from app.database.models import Blacklist, User
+from app.utils.validator import edit_user_schema, login_schema, register_schema, validateObject
 from flask import request
 from flask_jwt_extended import (
-    jwt_required,
     create_access_token,
-    jwt_refresh_token_required,
     create_refresh_token,
     get_jwt_identity,
     get_raw_jwt,
+    jwt_refresh_token_required,
+    jwt_required,
 )
-from app import db
-from app.api import api_blueprint
-from app.database.models import User, Blacklist
-from app.utils.validator import validateObject, login_schema, register_schema, edit_user_schema
 
 
 def get_current_user():
diff --git a/server/coverage_report.py b/server/coverage_report.py
new file mode 100644
index 00000000..209d8d6e
--- /dev/null
+++ b/server/coverage_report.py
@@ -0,0 +1,10 @@
+import xml.etree.ElementTree as et
+
+tree = et.parse('coverage.xml')
+root = tree.getroot()
+for package in tree.find('.//packages'):
+  package.set('name', 'server.' + package.attrib.get('name'))
+  for package_class in package.find('classes'):
+    package_class.set('name', 'server.' + package_class.attrib.get('name'))
+    package_class.set('filename', 'server/' + package_class.attrib.get('filename'))
+tree.write('coverage.xml')
diff --git a/server/tests/__init__.py b/server/tests/__init__.py
index 0d8c1354..20860256 100644
--- a/server/tests/__init__.py
+++ b/server/tests/__init__.py
@@ -9,7 +9,6 @@ def app():
     with app.app_context():
         db.drop_all()
         db.create_all()
-
     return app
 
 
-- 
GitLab