import os import json from sqlalchemy import Table from app import db from config import TestConfig from psycopg2.extras import Json from datetime import datetime def get_file_path(fixture_file_name): return os.path.join(os.path.join(os.path.dirname(__file__)), fixture_file_name) def load_fixture(name) -> dict: path = get_file_path(name) with open(path) as f: return json.load(f) class FixtureLoader: def __init__(self, models): self.db_name = TestConfig.DB_NAME self.models = models def import_data(self, sample_data): with db.engine.connect() as conn: with conn.begin(): for model in self.models: if isinstance(model, Table): records = sample_data.get(model.name, list()) self._load_data(conn, model, records) else: records = sample_data.get(model.__tablename__, list()) self._load_data(conn, model.__table__, records) def import_as_sql(self, sample_data): sql_query = list() for model in self.models: if isinstance(model, Table): table = model records = sample_data.get(model.name, list()) else: table = model.__table__ records = sample_data.get(model.__tablename__, list()) [sql_query.append(self._insert_query_maker(table, record)) for record in records] with db.engine.connect() as conn: with conn.begin(): conn.execute("; ".join(sql_query)) def _insert_query_maker(self, tablename, rowdict): sql_values = list() for value in rowdict.values(): if isinstance(value, (str, datetime)): sql_values.append("'{value}'".format(value=value)) elif isinstance(value, dict): sql_values.append(str(Json(value))) else: sql_values.append(str(value)) str_keys = ", ".join(map(lambda k: self.__escape_reserved(k), rowdict.keys())) return 'INSERT INTO "{tablename}" ({keys}) VALUES ({values})'.format( tablename=str(tablename), keys=str_keys, values=", ".join(sql_values) ) def __escape_reserved(self, keyword): if self.__is_reserved_keyword(keyword): return '"{}"'.format(keyword) return keyword def __is_reserved_keyword(self, keyword): # TODO: Add complete list of reserved keywords return keyword.lower() in ["order", "group"] @staticmethod def _load_data(conn, table, records): for record in records: conn.execute(table.insert().values(**record)) jwt = { "decibel/role": {"name": "User", "slug": "user"}, "decibel/labels": [], "atlasum/role": {"name": "Developer", "slug": "developer"}, "sub": "sme-dna|5f7594e4f19badcd999983ec93f5e2b1", "email": "user1@sonymusic.com", "name": "User 1", "iat": 1639064369, "exp": 1639065269, "nbf": 1639064369, } bearer = "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlJFWXdRMFEzTjBWRk1URTVOVFEwUlRkRVJFUkRNVFZDUkRGQk9\ ERTFRell5TnpZek5FWXdPUSJ9.eyJpc3MiOiJodHRwczovL3NtZS1kbmEuYXV0aDAuY29tLyIsInN1YiI6ImF1dGgwfDVjZjAwOTFkNmM5MWQzMT\ BmZTZmY2RjNiIsImF1ZCI6WyJodHRwOi8vbWFya2V0aW5nLWxiLTEyNzMwNDEzMjIudXMtZWFzdC0xLmVsYi5hbWF6b25hd3MuY29tL2FwaSIsIm\ h0dHBzOi8vc21lLWRuYS5hdXRoMC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNTY0MzM3MDYwLCJleHAiOjE1NjQzNDQyNjAsImF6cCI6Im5CRDl2eG\ I0a2VKQ2xwMGNuOHJURkNTRWpaVE83S1l6Iiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSJ9.qS3p_dnGA04xbGzNzzgz8J5tkjLmSKmPBgWjFMOKL\ ITP8r6KCOFh98ymig7Qxdr5TnEqlWuO01wWfCCMApAO-Kt0iv1Pxjh3MUAMFAq4oE_1Hu7ZW-tF3hHzYLdSzqvL6BhPZs14Q84vLrzE_cGnJLKT0\ T6CxgyKXEjJf2-QYT8ho6JZJnfmzAX1tW383yNt14e00gX0vIEET76BMp5x_t3eLg7VIEtj7YK2ux7V__wEO6oClzVxMo8v3ScKqqPfVsm8KwDSz\ -_jYGZq9j2jfS85476DBM-UHdpWjd9b-_4vG8ps6P4X9gllexhsjDMz5SszN9YGOTosLPeKNVFC1A"