/tests/test_writer.py

https://github.com/foxxtrot/py-mysql2pgsql · Python · 124 lines · 92 code · 30 blank · 2 comment · 6 complexity · c38a17c51fad49f2b6c35ccc3d476a8e MD5 · raw file

  1. from __future__ import with_statement, absolute_import
  2. import os
  3. import sys
  4. import re
  5. import tempfile
  6. import unittest
  7. from . import WithReader
  8. sys.path.append(os.path.abspath('../'))
  9. from mysql2pgsql.lib.postgres_writer import PostgresWriter
  10. from mysql2pgsql.lib.postgres_file_writer import PostgresFileWriter
  11. from mysql2pgsql.lib.postgres_db_writer import PostgresDbWriter
  12. def squeeze(val):
  13. return re.sub(r"[\x00-\x20]+", " ", val).strip()
  14. class WithTables(WithReader):
  15. def setUp(self):
  16. super(WithTables, self).setUp()
  17. self.table1 = next((t for t in self.reader.tables if t.name == 'type_conversion_test_1'), None)
  18. self.table2 = next((t for t in self.reader.tables if t.name == 'type_conversion_test_2'), None)
  19. assert self.table1
  20. assert self.table2
  21. class TestPostgresWriter(WithTables):
  22. def setUp(self):
  23. super(self.__class__, self).setUp()
  24. self.writer = PostgresWriter()
  25. assert self.writer
  26. def test_truncate(self):
  27. trunc_cmds = self.writer.truncate(self.table1)
  28. assert len(trunc_cmds) == 2
  29. trunc_stmt, reset_seq = trunc_cmds
  30. assert squeeze(trunc_stmt) == 'TRUNCATE "%s" CASCADE;' % self.table1.name
  31. if reset_seq:
  32. self.assertRegexpMatches(squeeze(reset_seq),
  33. "^SELECT pg_catalog.setval\(pg_get_serial_sequence\('%s', 'id'\), \d+, true\);$" % self.table1.name)
  34. def test_write_table(self):
  35. write_table_cmds = self.writer.write_table(self.table1)
  36. assert len(write_table_cmds) == 2
  37. table_cmds, seq_cmds = write_table_cmds
  38. assert len(table_cmds) == 2
  39. assert squeeze(table_cmds[0]) == 'DROP TABLE IF EXISTS "%s" CASCADE;' % self.table1.name
  40. assert 'CREATE TABLE "%s"' % self.table1.name in table_cmds[1]
  41. # assert self.assertRegexpMatches(squeeze(table_cmds[1]),
  42. # '^CREATE TABLE "%s" \(.*\) WITHOUT OIDS;$' % self.table1.name)
  43. if seq_cmds:
  44. assert len(seq_cmds) == 3
  45. self.assertRegexpMatches(squeeze(seq_cmds[0]),
  46. '^DROP SEQUENCE IF EXISTS %s_([^\s]+)_seq CASCADE;$' % self.table1.name)
  47. self.assertRegexpMatches(squeeze(seq_cmds[1]),
  48. '^CREATE SEQUENCE %s_([^\s]+)_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1;$' % self.table1.name)
  49. self.assertRegexpMatches(squeeze(seq_cmds[2]),
  50. "^SELECT pg_catalog.setval\('%s_([^\s]+)_seq', \d+, true\);$" % self.table1.name)
  51. def test_write_indexex(self):
  52. index_cmds = self.writer.write_indexes(self.table1)
  53. assert len(index_cmds) == 9
  54. def test_write_constraints(self):
  55. constraint_cmds = self.writer.write_constraints(self.table2)
  56. assert constraint_cmds
  57. class WithOutput(WithTables):
  58. def setUp(self):
  59. super(WithOutput, self).setUp()
  60. def tearDown(self):
  61. super(WithOutput, self).tearDown()
  62. class TestPostgresFileWriter(WithOutput):
  63. def setUp(self):
  64. super(self.__class__, self).setUp()
  65. self.outfile = tempfile.NamedTemporaryFile()
  66. self.writer = PostgresFileWriter(self.outfile)
  67. def tearDown(self):
  68. super(self.__class__, self).tearDown()
  69. self.writer.close()
  70. def test_truncate(self):
  71. self.writer.truncate(self.table1)
  72. def test_write_table(self):
  73. self.writer.write_table(self.table1)
  74. def test_write_indexes(self):
  75. self.writer.write_indexes(self.table1)
  76. def test_write_constraints(self):
  77. self.writer.write_constraints(self.table2)
  78. def test_write_contents(self):
  79. self.writer.write_contents(self.table1, self.reader)
  80. class TestPostgresDbWriter(WithOutput):
  81. def setUp(self):
  82. super(self.__class__, self).setUp()
  83. self.writer = PostgresDbWriter(self.config.options['destination']['postgres'], True)
  84. def tearDown(self):
  85. super(self.__class__, self).tearDown()
  86. self.writer.close()
  87. def test_truncate(self):
  88. self.writer.truncate(self.table1)
  89. def test_write_table_indexes_and_constraints(self):
  90. self.writer.write_table(table=self.table1)
  91. self.writer.write_indexes(self.table1)
  92. self.writer.write_constraints(self.table2)
  93. def test_write_contents(self):
  94. self.writer.write_contents(self.table1, self.reader)