test_autogen_computed.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import sqlalchemy as sa
  2. from sqlalchemy import Column
  3. from sqlalchemy import Integer
  4. from sqlalchemy import MetaData
  5. from sqlalchemy import Table
  6. from ._autogen_fixtures import AutogenFixtureTest
  7. from ... import testing
  8. from ...testing import eq_
  9. from ...testing import is_
  10. from ...testing import is_true
  11. from ...testing import mock
  12. from ...testing import TestBase
  13. class AutogenerateComputedTest(AutogenFixtureTest, TestBase):
  14. __requires__ = ("computed_columns",)
  15. __backend__ = True
  16. def test_add_computed_column(self):
  17. m1 = MetaData()
  18. m2 = MetaData()
  19. Table("user", m1, Column("id", Integer, primary_key=True))
  20. Table(
  21. "user",
  22. m2,
  23. Column("id", Integer, primary_key=True),
  24. Column("foo", Integer, sa.Computed("5")),
  25. )
  26. diffs = self._fixture(m1, m2)
  27. eq_(diffs[0][0], "add_column")
  28. eq_(diffs[0][2], "user")
  29. eq_(diffs[0][3].name, "foo")
  30. c = diffs[0][3].computed
  31. is_true(isinstance(c, sa.Computed))
  32. is_(c.persisted, None)
  33. eq_(str(c.sqltext), "5")
  34. def test_remove_computed_column(self):
  35. m1 = MetaData()
  36. m2 = MetaData()
  37. Table(
  38. "user",
  39. m1,
  40. Column("id", Integer, primary_key=True),
  41. Column("foo", Integer, sa.Computed("5")),
  42. )
  43. Table("user", m2, Column("id", Integer, primary_key=True))
  44. diffs = self._fixture(m1, m2)
  45. eq_(diffs[0][0], "remove_column")
  46. eq_(diffs[0][2], "user")
  47. c = diffs[0][3]
  48. eq_(c.name, "foo")
  49. is_true(isinstance(c.computed, sa.Computed))
  50. is_true(isinstance(c.server_default, sa.Computed))
  51. @testing.combinations(
  52. lambda: (None, sa.Computed("bar*5")),
  53. (lambda: (sa.Computed("bar*5"), None)),
  54. lambda: (
  55. sa.Computed("bar*5"),
  56. sa.Computed("bar * 42", persisted=True),
  57. ),
  58. lambda: (sa.Computed("bar*5"), sa.Computed("bar * 42")),
  59. )
  60. def test_cant_change_computed_warning(self, test_case):
  61. arg_before, arg_after = testing.resolve_lambda(test_case, **locals())
  62. m1 = MetaData()
  63. m2 = MetaData()
  64. arg_before = [] if arg_before is None else [arg_before]
  65. arg_after = [] if arg_after is None else [arg_after]
  66. Table(
  67. "user",
  68. m1,
  69. Column("id", Integer, primary_key=True),
  70. Column("bar", Integer),
  71. Column("foo", Integer, *arg_before),
  72. )
  73. Table(
  74. "user",
  75. m2,
  76. Column("id", Integer, primary_key=True),
  77. Column("bar", Integer),
  78. Column("foo", Integer, *arg_after),
  79. )
  80. with mock.patch("alembic.util.warn") as mock_warn:
  81. diffs = self._fixture(m1, m2)
  82. eq_(
  83. mock_warn.mock_calls,
  84. [mock.call("Computed default on user.foo cannot be modified")],
  85. )
  86. eq_(list(diffs), [])
  87. @testing.combinations(
  88. lambda: (None, None),
  89. lambda: (sa.Computed("5"), sa.Computed("5")),
  90. lambda: (sa.Computed("bar*5"), sa.Computed("bar*5")),
  91. lambda: (sa.Computed("bar*5"), sa.Computed("bar * \r\n\t5")),
  92. )
  93. def test_computed_unchanged(self, test_case):
  94. arg_before, arg_after = testing.resolve_lambda(test_case, **locals())
  95. m1 = MetaData()
  96. m2 = MetaData()
  97. arg_before = [] if arg_before is None else [arg_before]
  98. arg_after = [] if arg_after is None else [arg_after]
  99. Table(
  100. "user",
  101. m1,
  102. Column("id", Integer, primary_key=True),
  103. Column("bar", Integer),
  104. Column("foo", Integer, *arg_before),
  105. )
  106. Table(
  107. "user",
  108. m2,
  109. Column("id", Integer, primary_key=True),
  110. Column("bar", Integer),
  111. Column("foo", Integer, *arg_after),
  112. )
  113. with mock.patch("alembic.util.warn") as mock_warn:
  114. diffs = self._fixture(m1, m2)
  115. eq_(mock_warn.mock_calls, [])
  116. eq_(list(diffs), [])