Skip to content
Snippets Groups Projects
Verified Commit b3275303 authored by Martin Weise's avatar Martin Weise
Browse files

Update the tests

parent f85fb1e9
No related branches found
No related tags found
1 merge request!379Fixed the sync
Showing
with 621 additions and 79 deletions
......@@ -348,6 +348,9 @@ test-search-service:
before_script:
- "cp -r ./dbrepo-search-service/init/clients ./dbrepo-search-service/clients"
- "cp -r ./dbrepo-search-service/init/omlib ./dbrepo-search-service/omlib"
- "cp ./dbrepo-search-service/init/test/test_keycloak_client.py ./dbrepo-search-service/test"
- "cp ./dbrepo-search-service/init/test/test_opensearch_client.py ./dbrepo-search-service/test"
- "cp ./dbrepo-search-service/init/friendly_names_overrides.json ./dbrepo-search-service/friendly_names_overrides.json"
script:
- "pip install pipenv"
- "pipenv install gunicorn && pipenv install --dev --system --deploy"
......@@ -375,7 +378,7 @@ test-search-service-init:
script:
- "pip install pipenv"
- "pipenv install gunicorn && pipenv install --dev --system --deploy"
- cd ./dbrepo-search-service/init/ && coverage run -m pytest test/test_app.py --junitxml=report.xml && coverage html && coverage report > ./coverage.txt
- cd ./dbrepo-search-service/init/ && coverage run -m pytest test/test_app.py test/test_keycloak_client.py test/test_opensearch_client.py --junitxml=report.xml && coverage html && coverage report > ./coverage.txt
- "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'"
artifacts:
when: always
......
......@@ -38,6 +38,9 @@ MANIFEST
*.manifest
*.spec
# generate
/friendly_names_overrides.json
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
......
......@@ -19,9 +19,9 @@ WORKDIR /app
COPY --chown=1001 ./init/clients ./clients
COPY --chown=1001 ./init/omlib ./omlib
COPY --chown=1001 ./init/friendly_names_overrides.json ./friendly_names_overrides.json
COPY --chown=1001 ./os-yml ./os-yml
COPY --chown=1001 ./app.py ./app.py
COPY --chown=1001 ./friendly_names_overrides.json ./friendly_names_overrides.json
# non-root port
EXPOSE 8080
......
......@@ -186,7 +186,7 @@ app.config["METADATA_SERVICE_ENDPOINT"] = os.getenv("METADATA_SERVICE_ENDPOINT",
app.config["JWT_ALGORITHM"] = "HS256"
app.config["JWT_PUBKEY"] = '-----BEGIN PUBLIC KEY-----\n' + os.getenv("JWT_PUBKEY",
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB") + '\n-----END PUBLIC KEY-----'
app.config["AUTH_SERVICE_ENDPOINT"] = os.getenv("AUTH_SERVICE_ENDPOINT", "http://auth-service:8080/api/auth")
app.config["AUTH_SERVICE_ENDPOINT"] = os.getenv("AUTH_SERVICE_ENDPOINT", "http://auth-service:8080")
app.config["AUTH_SERVICE_CLIENT"] = os.getenv("AUTH_SERVICE_CLIENT", "dbrepo-client")
app.config["AUTH_SERVICE_CLIENT_SECRET"] = os.getenv("AUTH_SERVICE_CLIENT_SECRET", "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG")
app.config["OPENSEARCH_HOST"] = os.getenv('OPENSEARCH_HOST', 'search-db')
......
[report]
omit =
# omit tests
./test/*
\ No newline at end of file
......@@ -9,12 +9,14 @@ opensearch-py = "~=2.2"
python-dotenv = "~=1.0"
testcontainers-opensearch = "*"
pytest = "*"
dbrepo = {path = "./lib/dbrepo-1.6.3.tar.gz"}
dbrepo = {path = "./lib/dbrepo-1.6.4.tar.gz"}
rdflib = "*"
[dev-packages]
coverage = "*"
pytest = "*"
requests-mock = "*"
jwt = "~=1.3"
[requires]
python_version = "3.11"
This diff is collapsed.
import logging
import os
from dataclasses import dataclass
from typing import List
import requests
from dbrepo.api.dto import ApiError
from flask import current_app
from jwt import jwk_from_pem, JWT
from jwt.exceptions import JWTDecodeError
......@@ -20,13 +20,13 @@ class KeycloakClient:
def obtain_user_token(self, username: str, password: str) -> str:
response = requests.post(
f"{current_app.config['AUTH_SERVICE_ENDPOINT']}/realms/dbrepo/protocol/openid-connect/token",
f"{os.getenv('AUTH_SERVICE_ENDPOINT', 'http://auth-service:8080')}/realms/dbrepo/protocol/openid-connect/token",
data={
"username": username,
"password": password,
"grant_type": "password",
"client_id": current_app.config["AUTH_SERVICE_CLIENT"],
"client_secret": current_app.config["AUTH_SERVICE_CLIENT_SECRET"]
"client_id": os.getenv("AUTH_SERVICE_CLIENT", "dbrepo-client"),
"client_secret": os.getenv("AUTH_SERVICE_CLIENT_SECRET", "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG")
})
body = response.json()
if "access_token" not in body:
......@@ -34,7 +34,9 @@ class KeycloakClient:
return response.json()["access_token"]
def verify_jwt(self, access_token: str) -> ApiError | User:
public_key = jwk_from_pem(str(current_app.config["JWT_PUBKEY"]).encode('utf-8'))
public_key = jwk_from_pem(str('-----BEGIN PUBLIC KEY-----\n' + os.getenv("JWT_PUBKEY",
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB") + '\n-----END PUBLIC KEY-----').encode(
'utf-8'))
payload = JWT().decode(message=access_token, key=public_key, do_time_check=True)
return User(id=payload.get('uid'), username=payload.get('client_id'),
roles=payload.get('realm_access')["roles"])
......
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQABAoIBADNcMt6hAHub4JTAYS6Mra0EPRBO2XhWmACBrv3+8ETClXd5475KPLDewgRVtlmtbwU8G8awUXESQgPS9lfiqvQhPreA3cHlm6oP2WMKOEtakr2s8I+frsTBLCo0Ini9RaSzjoVVgS0zofyhASKi+T970MafSj5P3XNb8YBFdXgoYDiA7FXLH6a/+m7LScL+wGcFMAAeYESxZbMQLfH3v8L+4EcTraiwjLG17ZdlF3dpybMyUSse6ZQ/PdlyvBuzzLXhN6Ce2gd9ATfS+YWTzo7Yf+GU+ex5bIpVOfHqtuM/hyq7YGKENClsXwNZIAoFnvGCbvECAfgyapVrD30IfykCgYEA0rgsSZ82pxT40NxwgBD1g9lbNVBKXphRB/3S078qusUzJjT7AldEj4imGPhAbI7bI8gAeWJsp1XJWkjM8ktaVrh+NQl7p8e9OPh0pQF/5Bdg8ajbjXESpjnaU66pVYRQy/d+jNli/YRAHX5RUfsBl+6W4+WSVMGmKBiqJsur+ecCgYEAz1YVXClcmUnyZem5B+2E9noIzjF6ROE+jIb6rawM85P3Xd0lXtECQavtxw+Qk7I32qOwrxl1UpK2foVel3pazi+4OpMfmqtYGenRP1Zk1cZwrDo0cIemTDGjj3kJ8tYn12CGolFQpJZgK6OHzvG0tOxI5VZgjIViWNPe1PGWXtUCgYEAxXGNDe8BZs1f11S2lUlOw5yGug3hoYFXbAWJ5p7Ziuf8ZXB/QlJDC7se54a11wKEk6Jzz0lKRgE8CjzszJuOqnN0zn10QGIIC7nCklo1W6QMUmPGVWH994N976tZP6gbjQL6sT+AYcvpx7j0ubxYYeRNvnz+ACzzY964kGGHY0ECgYEAumlwPPNnMN7+VEjGNm2D7UMdJZ3wi3tkjF5ThdA5uMohTsAk+FG80KSu3RmOaGyEsUwY7+VYyYvlDm4E9PZqLBVVczyR3rMNPAcwPd0EPfvzk7WlLkOX7ct3fehaXH3VRlyfz9KCSeh1wOZ/lT1VtpD2nVOC7PSDzs92+kfXZZ0CgYAnrD1y4skgXkdwolZ3unn3EFyGm2d+X5aMTHwQPdWxqoNIAl/9wdghlzihwnPhhsxq1WzlxuC3V2IMrNPtRx70Mi+FbSmR5m4Xx5RptgMtMlwno+L40PzNJgMjHGjt0wcx3Vel8wuohDtnqMyS7P5nG1/TQx0Cyzwn7QOXlNpgbQ==
-----END RSA PRIVATE KEY-----
\ No newline at end of file
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQABAoIBADNcMt6hAHub4JTAYS6Mra0EPRBO2XhWmACBrv3+8ETClXd5475KPLDewgRVtlmtbwU8G8awUXESQgPS9lfiqvQhPreA3cHlm6oP2WMKOEtakr2s8I+frsTBLCo0Ini9RaSzjoVVgS0zofyhASKi+T970MafSj5P3XNb8YBFdXgoYDiA7FXLH6a/+m7LScL+wGcFMAAeYESxZbMQLfH3v8L+4EcTraiwjLG17ZdlF3dpybMyUSse6ZQ/PdlyvBuzzLXhN6Ce2gd9ATfS+YWTzo7Yf+GU+ex5bIpVOfHqtuM/hyq7YGKENClsXwNZIAoFnvGCbvECAfgyapVrD30IfykCgYEA0rgsSZ82pxT40NxwgBD1g9lbNVBKXphRB/3S078qusUzJjT7AldEj4imGPhAbI7bI8gAeWJsp1XJWkjM8ktaVrh+NQl7p8e9OPh0pQF/5Bdg8ajbjXESpjnaU66pVYRQy/d+jNli/YRAHX5RUfsBl+6W4+WSVMGmKBiqJsur+ecCgYEAz1YVXClcmUnyZem5B+2E9noIzjF6ROE+jIb6rawM85P3Xd0lXtECQavtxw+Qk7I32qOwrxl1UpK2foVel3pazi+4OpMfmqtYGenRP1Zk1cZwrDo0cIemTDGjj3kJ8tYn12CGolFQpJZgK6OHzvG0tOxI5VZgjIViWNPe1PGWXtUCgYEAxXGNDe8BZs1f11S2lUlOw5yGug3hoYFXbAWJ5p7Ziuf8ZXB/QlJDC7se54a11wKEk6Jzz0lKRgE8CjzszJuOqnN0zn10QGIIC7nCklo1W6QMUmPGVWH994N976tZP6gbjQL6sT+AYcvpx7j0ubxYYeRNvnz+ACzzY964kGGHY0ECgYEAumlwPPNnMN7+VEjGNm2D7UMdJZ3wi3tkjF5ThdA5uMohTsAk+FG80KSu3RmOaGyEsUwY7+VYyYvlDm4E9PZqLBVVczyR3rMNPAcwPd0EPfvzk7WlLkOX7ct3fehaXH3VRlyfz9KCSeh1wOZ/lT1VtpD2nVOC7PSDzs92+kfXZZ0CgYAnrD1y4skgXkdwolZ3unn3EFyGm2d+X5aMTHwQPdWxqoNIAl/9wdghlzihwnPhhsxq1WzlxuC3V2IMrNPtRx70Mi+FbSmR5m4Xx5RptgMtMlwno+L40PzNJgMjHGjt0wcx3Vel8wuohDtnqMyS7P5nG1/TQx0Cyzwn7QOXlNpgbQ==
-----END RSA PRIVATE KEY-----
\ No newline at end of file
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB
-----END PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB
-----END PUBLIC KEY-----
......@@ -4,7 +4,6 @@ import unittest
import jwt
import requests_mock
from app import app
from clients.keycloak_client import KeycloakClient
......@@ -28,30 +27,27 @@ class JwtTest(unittest.TestCase):
return jwt.JWT().encode(claims, jwt.jwk_from_pem(fh.read()), alg='RS256')
def test_obtain_user_token_succeeds(self):
with app.app_context():
with requests_mock.Mocker() as mock:
# mock
mock.post('http://auth-service:8080/api/auth/realms/dbrepo/protocol/openid-connect/token',
json=self.response("username"))
# test
token = KeycloakClient().obtain_user_token("username", "password")
self.assertEqual("eyEY1234", token)
with requests_mock.Mocker() as mock:
# mock
mock.post('http://auth-service:8080/realms/dbrepo/protocol/openid-connect/token',
json=self.response("username"))
# test
token = KeycloakClient().obtain_user_token("username", "password")
self.assertEqual("eyEY1234", token)
def test_obtain_user_token_malformed_fails(self):
with app.app_context():
with requests_mock.Mocker() as mock:
# mock
mock.post('http://auth-service:8080/api/auth/realms/dbrepo/protocol/openid-connect/token',
json={"client_id": "username"})
# test
try:
KeycloakClient().obtain_user_token("username", "password")
self.fail()
except AssertionError:
pass
with requests_mock.Mocker() as mock:
# mock
mock.post('http://auth-service:8080/realms/dbrepo/protocol/openid-connect/token',
json={"client_id": "username"})
# test
try:
KeycloakClient().obtain_user_token("username", "password")
self.fail()
except AssertionError:
pass
def test_verify_jwt_succeeds(self):
with app.app_context():
# test
user = KeycloakClient().verify_jwt(self.token("username", []))
self.assertEqual("username", user.username)
# test
user = KeycloakClient().verify_jwt(self.token("username", []))
self.assertEqual("username", user.username)
import unittest
import opensearchpy
import os
from dbrepo.api.dto import Database, Table, Column, ColumnType, Constraints, PrimaryKey, \
ConceptBrief, UnitBrief, UserBrief, ContainerBrief, ImageBrief, TableBrief, ColumnBrief
from opensearchpy import NotFoundError
from app import app
from init.clients.opensearch_client import OpenSearchClient
from clients.opensearch_client import OpenSearchClient
req = Database(id=1,
name="Test",
......@@ -56,160 +56,151 @@ req = Database(id=1,
class OpenSearchClientTest(unittest.TestCase):
def test_update_database_succeeds(self):
with app.app_context():
req.tables = [Table(id=1,
name="Test Table",
internal_name="test_table",
queue_name="dbrepo",
routing_key="dbrepo.test_tuw1.test_table",
is_public=True,
is_schema_public=True,
database_id=req.id,
constraints=Constraints(uniques=[], foreign_keys=[], checks=[],
primary_key=[PrimaryKey(id=1,
table=TableBrief(id=1,
database_id=req.id,
name="Test Table",
internal_name="test_table",
is_public=True,
is_schema_public=True,
is_versioned=True,
owned_by="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502"),
column=ColumnBrief(id=1,
name="ID",
database_id=req.id,
table_id=1,
internal_name="id",
type=ColumnType.BIGINT))]),
is_versioned=True,
owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"),
columns=[Column(id=1,
database_id=req.id,
table_id=1,
ord=0,
name="ID",
internal_name="id",
type=ColumnType.BIGINT,
is_null_allowed=False)])]
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# test
database = OpenSearchClient().update_database(database_id=req.id, data=req)
self.assertEqual(1, database.id)
self.assertEqual("Test", database.name)
self.assertEqual("test_tuw1", database.internal_name)
self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.owner.id)
self.assertEqual("foo", database.owner.username)
self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.contact.id)
self.assertEqual("foo", database.contact.username)
self.assertEqual("dbrepo", database.exchange_name)
self.assertEqual(True, database.is_public)
self.assertEqual(1, database.container.id)
# ...
self.assertEqual(1, database.container.image.id)
# ...
self.assertEqual(1, len(database.tables))
self.assertEqual(1, database.tables[0].id)
self.assertEqual("Test Table", database.tables[0].name)
self.assertEqual("test_table", database.tables[0].internal_name)
self.assertEqual("dbrepo", database.tables[0].queue_name)
self.assertEqual("dbrepo.test_tuw1.test_table", database.tables[0].routing_key)
self.assertEqual(True, database.tables[0].is_public)
self.assertEqual(1, database.tables[0].database_id)
self.assertEqual(True, database.tables[0].is_versioned)
self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.tables[0].owner.id)
self.assertEqual("foo", database.tables[0].owner.username)
self.assertEqual(1, len(database.tables[0].columns))
self.assertEqual(1, database.tables[0].columns[0].id)
self.assertEqual("ID", database.tables[0].columns[0].name)
self.assertEqual("id", database.tables[0].columns[0].internal_name)
self.assertEqual(ColumnType.BIGINT, database.tables[0].columns[0].type)
self.assertEqual(1, database.tables[0].columns[0].database_id)
self.assertEqual(1, database.tables[0].columns[0].table_id)
self.assertEqual(False, database.tables[0].columns[0].is_null_allowed)
req.tables = [Table(id=1,
name="Test Table",
internal_name="test_table",
queue_name="dbrepo",
routing_key="dbrepo.test_tuw1.test_table",
is_public=True,
is_schema_public=True,
database_id=req.id,
constraints=Constraints(uniques=[], foreign_keys=[], checks=[],
primary_key=[PrimaryKey(id=1,
table=TableBrief(id=1,
database_id=req.id,
name="Test Table",
internal_name="test_table",
is_public=True,
is_schema_public=True,
is_versioned=True,
owned_by="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502"),
column=ColumnBrief(id=1,
name="ID",
database_id=req.id,
table_id=1,
internal_name="id",
type=ColumnType.BIGINT))]),
is_versioned=True,
owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"),
columns=[Column(id=1,
database_id=req.id,
table_id=1,
ord=0,
name="ID",
internal_name="id",
type=ColumnType.BIGINT,
is_null_allowed=False)])]
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# test
database = OpenSearchClient().update_database(database_id=req.id, data=req)
self.assertEqual(1, database.id)
self.assertEqual("Test", database.name)
self.assertEqual("test_tuw1", database.internal_name)
self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.owner.id)
self.assertEqual("foo", database.owner.username)
self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.contact.id)
self.assertEqual("foo", database.contact.username)
self.assertEqual("dbrepo", database.exchange_name)
self.assertEqual(True, database.is_public)
self.assertEqual(1, database.container.id)
# ...
self.assertEqual(1, database.container.image.id)
# ...
self.assertEqual(1, len(database.tables))
self.assertEqual(1, database.tables[0].id)
self.assertEqual("Test Table", database.tables[0].name)
self.assertEqual("test_table", database.tables[0].internal_name)
self.assertEqual("dbrepo", database.tables[0].queue_name)
self.assertEqual("dbrepo.test_tuw1.test_table", database.tables[0].routing_key)
self.assertEqual(True, database.tables[0].is_public)
self.assertEqual(1, database.tables[0].database_id)
self.assertEqual(True, database.tables[0].is_versioned)
self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.tables[0].owner.id)
self.assertEqual("foo", database.tables[0].owner.username)
self.assertEqual(1, len(database.tables[0].columns))
self.assertEqual(1, database.tables[0].columns[0].id)
self.assertEqual("ID", database.tables[0].columns[0].name)
self.assertEqual("id", database.tables[0].columns[0].internal_name)
self.assertEqual(ColumnType.BIGINT, database.tables[0].columns[0].type)
self.assertEqual(1, database.tables[0].columns[0].database_id)
self.assertEqual(1, database.tables[0].columns[0].table_id)
self.assertEqual(False, database.tables[0].columns[0].is_null_allowed)
def test_update_database_create_succeeds(self):
with app.app_context():
# test
database = OpenSearchClient().update_database(database_id=req.id, data=req)
self.assertEqual(1, database.id)
self.assertEqual("Test", database.name)
self.assertEqual("test_tuw1", database.internal_name)
self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.owner.id)
self.assertEqual("foo", database.owner.username)
self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.contact.id)
self.assertEqual("foo", database.contact.username)
self.assertEqual("dbrepo", database.exchange_name)
self.assertEqual(True, database.is_public)
self.assertEqual(1, database.container.id)
# ...
self.assertEqual(1, database.container.image.id)
# ...
self.assertEqual(1, len(database.tables))
# test
database = OpenSearchClient().update_database(database_id=req.id, data=req)
self.assertEqual(1, database.id)
self.assertEqual("Test", database.name)
self.assertEqual("test_tuw1", database.internal_name)
self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.owner.id)
self.assertEqual("foo", database.owner.username)
self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.contact.id)
self.assertEqual("foo", database.contact.username)
self.assertEqual("dbrepo", database.exchange_name)
self.assertEqual(True, database.is_public)
self.assertEqual(1, database.container.id)
# ...
self.assertEqual(1, database.container.image.id)
# ...
self.assertEqual(1, len(database.tables))
def test_update_database_malformed_fails(self):
with app.app_context():
app.config['OPENSEARCH_USERNAME'] = 'i_do_not_exist'
os.environ['OPENSEARCH_USERNAME'] = 'i_do_not_exist'
# test
try:
database = OpenSearchClient().update_database(database_id=req.id, data=req)
except opensearchpy.exceptions.TransportError:
pass
# test
try:
database = OpenSearchClient().update_database(database_id=req.id, data=req)
except opensearchpy.exceptions.TransportError:
pass
def test_delete_database_fails(self):
with app.app_context():
# test
try:
OpenSearchClient().delete_database(database_id=9999)
except opensearchpy.exceptions.NotFoundError:
pass
# test
try:
OpenSearchClient().delete_database(database_id=9999)
except opensearchpy.exceptions.NotFoundError:
pass
def test_delete_database_succeeds(self):
with app.app_context():
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# test
OpenSearchClient().delete_database(database_id=req.id)
# test
OpenSearchClient().delete_database(database_id=req.id)
def test_get_fields_for_index_database_succeeds(self):
with app.app_context():
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# test
response = OpenSearchClient().get_fields_for_index(field_type="database")
self.assertTrue(len(response) > 0)
# test
response = OpenSearchClient().get_fields_for_index(field_type="database")
self.assertTrue(len(response) > 0)
def test_get_fields_for_index_user_succeeds(self):
with app.app_context():
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# test
response = OpenSearchClient().get_fields_for_index(field_type="user")
self.assertTrue(len(response) > 0)
# test
response = OpenSearchClient().get_fields_for_index(field_type="user")
self.assertTrue(len(response) > 0)
def test_fuzzy_search_succeeds(self):
with app.app_context():
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# test
OpenSearchClient().fuzzy_search(search_term="test_tuw")
# test
OpenSearchClient().fuzzy_search(search_term="test_tuw")
def test_unit_independent_search_fails(self):
with app.app_context():
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# test
try:
OpenSearchClient().unit_independent_search(0, 100, {
"unit.uri": "http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius"})
self.fail()
except NotFoundError:
pass
# mock
OpenSearchClient().update_database(database_id=req.id, data=req)
# test
try:
OpenSearchClient().unit_independent_search(0, 100, {
"unit.uri": "http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius"})
self.fail()
except NotFoundError:
pass
#!/bin/bash
PIPENV_PIPFILE=./dbrepo-search-service/Pipfile
source ./dbrepo-search-service/venv/bin/activate
pip install pipenv
pipenv install gunicorn && pipenv install --dev --system --deploy
cd ./dbrepo-search-service/ && coverage run -m pytest test/test_app.py test/test_jwt.py test/test_opensearch_client.py test/test_keycloak_client.py --junitxml=report.xml && coverage html && coverage report > ./coverage.txt
cat ./coverage.txt | grep -o 'TOTAL[^%]*%'
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment