def test_encoding_no_entries(self): dmp = pgdumplib.new('test', 'LATIN1') dmp.entries = [] self.assertEqual(dmp.encoding, 'LATIN1') dmp.save('build/data/dump.test') dmp = pgdumplib.load('build/data/dump.test') self.assertEqual(dmp.encoding, 'UTF8')
def test_bad_encoding(self): dmp = pgdumplib.new('test') dmp.entries[0].defn = 'BAD ENTRY WILL FAIL' dmp.save('build/data/dump.test') dmp = pgdumplib.load('build/data/dump.test') self.assertEqual(dmp.encoding, 'UTF8')
def test_invalid_dependency(self): dmp = pgdumplib.new('test') with self.assertRaises(ValueError): dmp.add_entry(constants.TABLE, '', 'block_table', dependencies=[1024])
def test_encoding_not_first_entry(self): dmp = pgdumplib.new('test', 'LATIN1') entries = dmp.entries dmp.entries = [entries[1], entries[2], entries[0]] self.assertEqual(dmp.encoding, 'LATIN1') dmp.save('build/data/dump.test') dmp = pgdumplib.load('build/data/dump.test') self.assertEqual(dmp.encoding, 'LATIN1')
def test_no_data(self): dmp = pgdumplib.new('test') dmp.add_entry(constants.TABLE_DATA, '', 'empty_table', dump_id=5) with gzip.open(pathlib.Path(dmp._temp_dir.name) / '5.gz', 'wb') as h: h.write(b'') dmp.save('build/data/dump.test') dmp = pgdumplib.load('build/data/dump.test') data = [line for line in dmp.table_data('', 'empty_table')] self.assertEqual(len(data), 0)
def test_invalid_block_type_in_data(self): dmp = pgdumplib.new('test') dmp.add_entry(constants.TABLE_DATA, '', 'block_table', dump_id=128) with gzip.open(pathlib.Path(dmp._temp_dir.name) / '128.gz', 'wb') as h: h.write(b'1\t\1\t\1\n') with mock.patch('pgdumplib.constants.BLK_DATA', b'\x02'): dmp.save('build/data/dump.test') with self.assertRaises(RuntimeError): pgdumplib.load('build/data/dump.test')
def test_invalid_data_type(self): dmp = pgdumplib.new('test') dmp.add_entry('bad', 'entry_desc', constants.SECTION_DATA, None, 'INVALID') with gzip.open(pathlib.Path(dmp._temp_dir.name) / '4.gz', 'wb') as handle: handle.write(b'BADDATASHOULDBLOWUPHARD') with self.assertRaises(ValueError): dmp.save('build/data/dump.test')
def test_runtime_error_when_pos_not_set(self): dmp = pgdumplib.new('test') dmp.add_entry(constants.TABLE_DATA, 'public', 'table', dump_id=32) with gzip.open(pathlib.Path(dmp._temp_dir.name) / '32.gz', 'wb') as h: h.write(b'1\t\1\t\1\n') with mock.patch('pgdumplib.constants.K_OFFSET_POS_SET', 9): dmp.save('build/data/dump.test') with self.assertRaises(RuntimeError): pgdumplib.load('build/data/dump.test')
def test_dump_id_mismatch_in_data(self): dmp = pgdumplib.new('test') dmp.add_entry(constants.TABLE_DATA, '', 'block_table', dump_id=1024) with gzip.open(pathlib.Path(dmp._temp_dir.name) / '1024.gz', 'wb') as handle: handle.write(b'1\t\1\t\1\n') dmp.save('build/data/dump.test') with mock.patch('pgdumplib.dump.Dump._read_block_header') as rbh: rbh.return_value = constants.BLK_DATA, 2048 with self.assertRaises(RuntimeError): pgdumplib.load('build/data/dump.test')
def __init__(self, args): self._acls = {} self._args = args self._dependencies = {} self._dump_id = None self._first_avail_id = None self._inventory = {} self._objects = 0 self._processed = set({}) self._project_path = pathlib.Path(args.project) self._project = self._read_project_file() self._reverse_lookup = {} self._dump = pgdumplib.new(self._project.name, self._project.encoding)
def test_empty_save_does_not_err(self): dump = pgdumplib.new('test', 'UTF8') dump.save('build/data/dump.test') test_file = pathlib.Path('build/data/dump.test') self.assertTrue(test_file.exists()) test_file.unlink()
def test_empty_dump_has_base_entries(self): dump = pgdumplib.new('test', 'UTF8') self.assertEqual(len(dump.entries), 3)
def test_invalid_section(self): dmp = pgdumplib.new('test') with self.assertRaises(ValueError): dmp.add_entry('bad', 'block_table', 'INVALID')
def test_used_dump_id(self): dmp = pgdumplib.new('test') with self.assertRaises(ValueError): dmp.add_entry(constants.TABLE, '', 'table', dump_id=1)
def test_dump_expectations(self): dmp = pgdumplib.new('test', 'UTF8') database = dmp.add_entry( desc=constants.DATABASE, tag='postgres', owner='postgres', defn="""\ CREATE DATABASE postgres WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.utf8' LC_CTYPE = 'en_US.utf8';""", drop_stmt='DROP DATABASE postgres') dmp.add_entry( constants.COMMENT, tag='DATABASE postgres', owner='postgres', defn="""\ COMMENT ON DATABASE postgres IS 'default administrative connection database';""", dependencies=[database.dump_id]) example = dmp.add_entry( constants.TABLE, 'public', 'example', 'postgres', 'CREATE TABLE public.example (\ id UUID NOT NULL PRIMARY KEY, \ created_at TIMESTAMP WITH TIME ZONE, \ value TEXT NOT NULL);', 'DROP TABLE public.example') columns = 'id', 'created_at', 'value' fake = faker.Faker() fake.add_provider(date_time) rows = [ (uuid.uuid4(), fake.date_time(tzinfo=tz.tzutc()), 'foo'), (uuid.uuid4(), fake.date_time(tzinfo=tz.tzutc()), 'bar'), (uuid.uuid4(), fake.date_time(tzinfo=tz.tzutc()), 'baz'), (uuid.uuid4(), fake.date_time(tzinfo=tz.tzutc()), 'qux') ] with dmp.table_data_writer(example, columns) as writer: for row in rows: writer.append(*row) row = (uuid.uuid4(), fake.date_time(tzinfo=tz.tzutc()), None) rows.append(row) # Append a second time to get same writer with dmp.table_data_writer(example, columns) as writer: writer.append(*row) dmp.save('build/data/dump.test') test_file = pathlib.Path('build/data/dump.test') self.assertTrue(test_file.exists()) dmp = pgdumplib.load(test_file, converters.SmartDataConverter) entry = dmp.get_entry(database.dump_id) self.assertEqual(entry.desc, 'DATABASE') self.assertEqual(entry.owner, 'postgres') self.assertEqual(entry.tag, 'postgres') values = [row for row in dmp.table_data('public', 'example')] self.assertListEqual(values, rows)
def test_pgdumplib_new(self): dmp = pgdumplib.new('test', 'UTF8', converters.SmartDataConverter) self.assertIsInstance(dmp, dump.Dump) self.assertIsInstance(dmp._converter, converters.SmartDataConverter)
def test_invalid_desc(self): dmp = pgdumplib.new('test') with self.assertRaises(ValueError): dmp.add_entry('foo', '', 'table')