104 lines
4.6 KiB
Python
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)"
|