expected_catalog.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  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. from dbt.tests.util import AnyInteger
  16. def no_stats():
  17. return {
  18. "has_stats": {
  19. "id": "has_stats",
  20. "label": "Has Stats?",
  21. "value": False,
  22. "description": "Indicates whether there are statistics for this table",
  23. "include": False,
  24. },
  25. }
  26. def base_expected_catalog(
  27. project,
  28. role,
  29. id_type,
  30. text_type,
  31. time_type,
  32. view_type,
  33. table_type,
  34. seed_type,
  35. model_stats,
  36. seed_stats=None,
  37. case=None,
  38. case_columns=False,
  39. ):
  40. if case is None:
  41. def case(x):
  42. return x
  43. col_case = case if case_columns else lambda x: x
  44. if seed_stats is None:
  45. seed_stats = model_stats
  46. model_database = project.database
  47. my_schema_name = case(project.test_schema)
  48. alternate_schema = case(project.test_schema + "_test")
  49. expected_cols = {
  50. col_case("id"): {
  51. "name": col_case("id"),
  52. "index": AnyInteger(),
  53. "type": id_type,
  54. "comment": None,
  55. },
  56. col_case("first_name"): {
  57. "name": col_case("first_name"),
  58. "index": AnyInteger(),
  59. "type": text_type,
  60. "comment": None,
  61. },
  62. col_case("email"): {
  63. "name": col_case("email"),
  64. "index": AnyInteger(),
  65. "type": text_type,
  66. "comment": None,
  67. },
  68. col_case("ip_address"): {
  69. "name": col_case("ip_address"),
  70. "index": AnyInteger(),
  71. "type": text_type,
  72. "comment": None,
  73. },
  74. col_case("updated_at"): {
  75. "name": col_case("updated_at"),
  76. "index": AnyInteger(),
  77. "type": time_type,
  78. "comment": None,
  79. },
  80. }
  81. return {
  82. "nodes": {
  83. "model.test.model": {
  84. "unique_id": "model.test.model",
  85. "metadata": {
  86. "schema": my_schema_name,
  87. "database": model_database,
  88. "name": case("model"),
  89. "type": view_type,
  90. "comment": None,
  91. "owner": role,
  92. },
  93. "stats": model_stats,
  94. "columns": expected_cols,
  95. },
  96. "model.test.second_model": {
  97. "unique_id": "model.test.second_model",
  98. "metadata": {
  99. "schema": alternate_schema,
  100. "database": project.database,
  101. "name": case("second_model"),
  102. "type": view_type,
  103. "comment": None,
  104. "owner": role,
  105. },
  106. "stats": model_stats,
  107. "columns": expected_cols,
  108. },
  109. "seed.test.seed": {
  110. "unique_id": "seed.test.seed",
  111. "metadata": {
  112. "schema": my_schema_name,
  113. "database": project.database,
  114. "name": case("seed"),
  115. "type": seed_type,
  116. "comment": None,
  117. "owner": role,
  118. },
  119. "stats": seed_stats,
  120. "columns": expected_cols,
  121. },
  122. },
  123. "sources": {
  124. "source.test.my_source.my_table": {
  125. "unique_id": "source.test.my_source.my_table",
  126. "metadata": {
  127. "schema": my_schema_name,
  128. "database": project.database,
  129. "name": case("seed"),
  130. "type": seed_type,
  131. "comment": None,
  132. "owner": role,
  133. },
  134. "stats": seed_stats,
  135. "columns": expected_cols,
  136. },
  137. },
  138. }
  139. def expected_references_catalog(
  140. project,
  141. role,
  142. id_type,
  143. text_type,
  144. time_type,
  145. view_type,
  146. seed_type,
  147. table_type,
  148. model_stats,
  149. bigint_type=None,
  150. seed_stats=None,
  151. case=None,
  152. case_columns=False,
  153. view_summary_stats=None,
  154. ):
  155. if case is None:
  156. def case(x):
  157. return x
  158. col_case = case if case_columns else lambda x: x
  159. if seed_stats is None:
  160. seed_stats = model_stats
  161. if view_summary_stats is None:
  162. view_summary_stats = model_stats
  163. model_database = project.database
  164. my_schema_name = case(project.test_schema)
  165. summary_columns = {
  166. "first_name": {
  167. "name": "first_name",
  168. "index": 1,
  169. "type": text_type,
  170. "comment": None,
  171. },
  172. "ct": {
  173. "name": "ct",
  174. "index": 2,
  175. "type": bigint_type,
  176. "comment": None,
  177. },
  178. }
  179. seed_columns = {
  180. "id": {
  181. "name": col_case("id"),
  182. "index": 1,
  183. "type": id_type,
  184. "comment": None,
  185. },
  186. "first_name": {
  187. "name": col_case("first_name"),
  188. "index": 2,
  189. "type": text_type,
  190. "comment": None,
  191. },
  192. "email": {
  193. "name": col_case("email"),
  194. "index": 3,
  195. "type": text_type,
  196. "comment": None,
  197. },
  198. "ip_address": {
  199. "name": col_case("ip_address"),
  200. "index": 4,
  201. "type": text_type,
  202. "comment": None,
  203. },
  204. "updated_at": {
  205. "name": col_case("updated_at"),
  206. "index": 5,
  207. "type": time_type,
  208. "comment": None,
  209. },
  210. }
  211. return {
  212. "nodes": {
  213. "seed.test.seed": {
  214. "unique_id": "seed.test.seed",
  215. "metadata": {
  216. "schema": my_schema_name,
  217. "database": project.database,
  218. "name": case("seed"),
  219. "type": seed_type,
  220. "comment": None,
  221. "owner": role,
  222. },
  223. "stats": seed_stats,
  224. "columns": seed_columns,
  225. },
  226. "model.test.ephemeral_summary": {
  227. "unique_id": "model.test.ephemeral_summary",
  228. "metadata": {
  229. "schema": my_schema_name,
  230. "database": model_database,
  231. "name": case("ephemeral_summary"),
  232. "type": table_type,
  233. "comment": None,
  234. "owner": role,
  235. },
  236. "stats": model_stats,
  237. "columns": summary_columns,
  238. },
  239. "model.test.view_summary": {
  240. "unique_id": "model.test.view_summary",
  241. "metadata": {
  242. "schema": my_schema_name,
  243. "database": model_database,
  244. "name": case("view_summary"),
  245. "type": view_type,
  246. "comment": None,
  247. "owner": role,
  248. },
  249. "stats": view_summary_stats,
  250. "columns": summary_columns,
  251. },
  252. },
  253. "sources": {
  254. "source.test.my_source.my_table": {
  255. "unique_id": "source.test.my_source.my_table",
  256. "metadata": {
  257. "schema": my_schema_name,
  258. "database": project.database,
  259. "name": case("seed"),
  260. "type": seed_type,
  261. "comment": None,
  262. "owner": role,
  263. },
  264. "stats": seed_stats,
  265. "columns": seed_columns,
  266. },
  267. },
  268. }