test_clusters.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License in the LICENSE file at the
  6. # root of this repository, or online at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. import pytest
  16. from dbt.tests.util import check_relations_equal, run_dbt
  17. models__override_cluster_sql = """
  18. {{ config(cluster='not_default', materialized='materialized_view') }}
  19. select 1 as col_1
  20. """
  21. models__override_cluster_and_index_sql = """
  22. {{ config(
  23. cluster='not_default',
  24. materialized='materialized_view',
  25. indexes=[{'columns': ['col_1'], 'name':'c_i_col_1_idx'}]
  26. ) }}
  27. select 1 as col_1
  28. """
  29. models__override_index_cluster_sql = """
  30. {{ config(
  31. materialized='materialized_view',
  32. indexes=[{'columns': ['col_1'], 'cluster': 'not_default', 'name':'i_col_1_idx'}]
  33. ) }}
  34. select 1 as col_1
  35. """
  36. models__invalid_cluster_sql = """
  37. {{ config(cluster='not_exist', materialized='materialized_view') }}
  38. select 1 as col_1
  39. """
  40. project_override_cluster_sql = """
  41. {{ config(materialized='materialized_view') }}
  42. select 1 as col_1
  43. """
  44. models_actual_clusters = """
  45. select
  46. mv.name as materialized_view_name,
  47. c_mv.name as cluster_name,
  48. i.name as index_name,
  49. c_i.name as index_cluster_name
  50. from mz_materialized_views mv
  51. join mz_clusters c_mv on mv.cluster_id = c_mv.id
  52. left join mz_indexes i on mv.id = i.on_id
  53. left join mz_clusters c_i on i.cluster_id = c_i.id
  54. where mv.id like 'u%'
  55. """
  56. models_expected_clusters = """
  57. materialized_view_name,cluster_name,index_name,index_cluster_name
  58. override_cluster,not_default,,
  59. override_index_cluster,quickstart,i_col_1_idx,not_default
  60. override_cluster_and_index,not_default,c_i_col_1_idx,not_default
  61. """.lstrip()
  62. project_actual_clusters = """
  63. select
  64. c.name as cluster
  65. from mz_materialized_views v
  66. join mz_clusters c on v.cluster_id = c.id and v.name = 'override_cluster'
  67. """
  68. class TestModelCluster:
  69. @pytest.fixture(scope="class")
  70. def seeds(self):
  71. return {
  72. "expected_clusters.csv": models_expected_clusters,
  73. }
  74. @pytest.fixture(scope="class")
  75. def models(self):
  76. return {
  77. "override_cluster.sql": models__override_cluster_sql,
  78. "override_cluster_and_index.sql": models__override_cluster_and_index_sql,
  79. "override_index_cluster.sql": models__override_index_cluster_sql,
  80. "invalid_cluster.sql": models__invalid_cluster_sql,
  81. "actual_clusters.sql": models_actual_clusters,
  82. "default_cluster.sql": project_override_cluster_sql,
  83. }
  84. def test_materialize_override_ok(self, project):
  85. results = run_dbt(["seed"])
  86. assert len(results) == 1
  87. project.run_sql("CREATE CLUSTER not_default SIZE = '1'")
  88. run_dbt(["run", "--exclude", "invalid_cluster", "default_cluster"])
  89. check_relations_equal(project.adapter, ["actual_clusters", "expected_clusters"])
  90. def test_materialize_override_noexist(self, project):
  91. run_dbt(["run", "--models", "invalid_cluster"], expect_pass=False)
  92. # In the absence of the pre-installed `quickstart` cluster, Materialize
  93. # should not error if a user-provided cluster is specified as a profile,
  94. # model, test, or seed config, but will error otherwise.
  95. # See materialize#17197: https://github.com/MaterializeInc/materialize/pull/17197
  96. @pytest.fixture(scope="class")
  97. def project_config_update(self):
  98. return {
  99. "data_tests": {"cluster": "not_default"},
  100. "seeds": {"cluster": "not_default"},
  101. }
  102. def test_materialize_drop_quickstart(self, project):
  103. project.run_sql("DROP CLUSTER quickstart CASCADE")
  104. run_dbt(["run", "--models", "override_cluster"], expect_pass=True)
  105. run_dbt(["run", "--models", "default_cluster"], expect_pass=False)
  106. run_dbt(["test", "--models", "override_cluster"], expect_pass=True)
  107. run_dbt(["seed", "--models", "test_seed"], expect_pass=True)
  108. # NOTE(morsapaes): the operation that requires a valid cluster for
  109. # seeds (DELETE FROM) is only called on subsequent seed runs, so
  110. # re-run.
  111. run_dbt(["seed", "--models", "test_seed"], expect_pass=True)
  112. project.run_sql("CREATE CLUSTER quickstart SIZE = '1'")
  113. class TestProjectConfigCluster:
  114. @pytest.fixture(scope="class")
  115. def models(self):
  116. return {
  117. "override_cluster.sql": project_override_cluster_sql,
  118. }
  119. @pytest.fixture(scope="class")
  120. def project_config_update(self):
  121. return {
  122. "models": {
  123. "test": {
  124. "+cluster": "not_default",
  125. },
  126. },
  127. }
  128. def test_materialize_override_ok(self, project):
  129. run_dbt(["run", "--models", "override_cluster"])
  130. results = project.run_sql(project_actual_clusters, fetch="one")
  131. assert results[0] == "not_default"