Files
pyrseas/tests/dbobject/test_static.py
T
2025-05-20 09:24:29 -04:00

104 lines
4.6 KiB
Python

# -*- coding: utf-8 -*-
"""Test loading of data from and into static tables"""
import os
from pyrseas.testutils import DatabaseToMapTestCase
from pyrseas.testutils import InputMapToSqlTestCase
CREATE_STMT = "CREATE TABLE t1 (c1 integer, c2 text)"
FILE_PATH = 'table.t1.data'
TABLE_DATA = [(1, 'abc'), (2, 'def'), (3, 'ghi')]
TABLE_DATA2 = [(1, 'abc', 'row 1'), (3, 'ghi', 'row 2'), (2, 'def', 'row 3'),
(3, 'def', 'row 4')]
class StaticTableToMapTestCase(DatabaseToMapTestCase):
"""Test mapping and copying out of created tables"""
def tearDown(self):
self.remove_tempfiles()
def test_copy_static_table(self):
"Copy a two-column table to a file"
self.db.execute(CREATE_STMT)
for row in TABLE_DATA:
self.db.execute("INSERT INTO t1 VALUES (%s, %s)", row)
cfg = {'datacopy': {'schema sd': ['t1']}}
dbmap = self.to_map([], config=cfg)
assert dbmap['schema sd']['table t1'] == {
'columns': [{'c1': {'type': 'integer'}}, {'c2': {'type': 'text'}}]}
recs = []
with open(os.path.join(self.cfg['files']['data_path'],
"schema.sd", FILE_PATH)) as f:
for line in f:
(c1, c2) = line.split(',')
recs.append((int(c1), c2.rstrip()))
assert recs == TABLE_DATA
def test_copy_static_table_pk(self):
"Copy a table that has a primary key"
self.db.execute("CREATE TABLE t1 (c1 integer, c2 char(3), c3 text,"
"PRIMARY KEY (c2, c1))")
for row in TABLE_DATA2:
self.db.execute("INSERT INTO t1 VALUES (%s, %s, %s)", row)
cfg = {'datacopy': {'schema sd': ['t1']}}
dbmap = self.to_map([], config=cfg)
assert dbmap['schema sd']['table t1'] == {
'columns': [{'c1': {'type': 'integer', 'not_null': True}},
{'c2': {'type': 'character(3)', 'not_null': True}},
{'c3': {'type': 'text'}}],
'primary_key': {'t1_pkey': {'columns': ['c2', 'c1']}}}
recs = []
with open(os.path.join(self.cfg['files']['data_path'],
"schema.sd", FILE_PATH)) as f:
for line in f:
(c1, c2, c3) = line.split(',')
recs.append((int(c1), c2, c3.rstrip()))
assert recs == sorted(TABLE_DATA2)
class StaticTableToSqlTestCase(InputMapToSqlTestCase):
"""Test SQL generation of data import statements"""
def test_load_static_table(self):
"Truncate and import a two-column table"
inmap = self.std_map()
inmap['schema sd'].update({'table t1': {
'columns': [{'c1': {'type': 'integer'}},
{'c2': {'type': 'text'}}]}})
cfg = {'datacopy': {'schema sd': ['t1']}}
sql = self.to_sql(inmap, [CREATE_STMT], config=cfg)
copy_stmt = ("\\copy ", 'sd.t1', " from '",
os.path.join(self.cfg['files']['data_path'],
"schema.sd", FILE_PATH), "' csv")
assert sql[0] == "TRUNCATE ONLY sd.t1"
assert sql[1] == copy_stmt
def test_load_static_table_fk(self):
"Truncate and import a table which has a foreign key dependency"
stmts = ["CREATE TABLE t1 (pc1 integer PRIMARY KEY, pc2 text)",
"CREATE TABLE t2 (c1 integer, c2 integer REFERENCES t1, "
"c3 text)"]
inmap = self.std_map()
inmap['schema sd'].update({'table t1': {
'columns': [{'pc1': {'type': 'integer', 'not_null': True}},
{'pc2': {'type': 'text'}}],
'primary_key': {'t1_pkey': {'columns': ['pc1']}}}, 'table t2': {
'columns': [{'c1': {'type': 'integer'}},
{'c2': {'type': 'integer'}},
{'c3': {'type': 'text'}}],
'foreign_keys': {'t2_c2_fkey': {
'columns': ['c2'],
'references': {'schema': 'sd', 'table': 't1',
'columns': ['pc1']}}}}})
cfg = {'datacopy': {'schema sd': ['t1']}}
sql = self.to_sql(inmap, stmts, config=cfg)
copy_stmt = ("\\copy ", 'sd.t1', " from '",
os.path.join(self.cfg['files']['data_path'],
"schema.sd", FILE_PATH), "' csv")
assert sql[0] == "ALTER TABLE sd.t2 DROP CONSTRAINT t2_c2_fkey"
assert sql[1] == "TRUNCATE ONLY sd.t1"
assert sql[2] == copy_stmt
assert sql[3] == "ALTER TABLE sd.t2 ADD CONSTRAINT t2_c2_fkey " \
"FOREIGN KEY (c2) REFERENCES sd.t1 (pc1)"