-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathtest_utils.py
More file actions
229 lines (164 loc) · 7.37 KB
/
test_utils.py
File metadata and controls
229 lines (164 loc) · 7.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
import pytest
from dbt.tests.adapter.utils.base_utils import BaseUtils
from dbt.tests.adapter.utils.fixture_date_trunc import models__test_date_trunc_yml
from dbt.tests.adapter.utils.fixture_datediff import (
seeds__data_datediff_csv,
models__test_datediff_yml,
)
from dbt.tests.adapter.utils.test_any_value import BaseAnyValue
from dbt.tests.adapter.utils.test_array_append import BaseArrayAppend
from dbt.tests.adapter.utils.test_array_concat import BaseArrayConcat
from dbt.tests.adapter.utils.test_array_construct import BaseArrayConstruct
from dbt.tests.adapter.utils.test_bool_or import BaseBoolOr
from dbt.tests.adapter.utils.test_cast_bool_to_text import BaseCastBoolToText
from dbt.tests.adapter.utils.test_concat import BaseConcat
from dbt.tests.adapter.utils.test_current_timestamp import BaseCurrentTimestampNaive
from dbt.tests.adapter.utils.test_dateadd import BaseDateAdd
#from dbt.tests.adapter.utils.test_datediff import BaseDateDiff
from dbt.tests.adapter.utils.test_escape_single_quotes import BaseEscapeSingleQuotesQuote
from dbt.tests.adapter.utils.test_escape_single_quotes import BaseEscapeSingleQuotesBackslash
from dbt.tests.adapter.utils.test_except import BaseExcept
from dbt.tests.adapter.utils.test_hash import BaseHash
from dbt.tests.adapter.utils.test_intersect import BaseIntersect
from dbt.tests.adapter.utils.test_last_day import BaseLastDay
from dbt.tests.adapter.utils.test_length import BaseLength
from dbt.tests.adapter.utils.test_listagg import BaseListagg
from dbt.tests.adapter.utils.test_position import BasePosition
from dbt.tests.adapter.utils.test_replace import BaseReplace
from dbt.tests.adapter.utils.test_right import BaseRight
from dbt.tests.adapter.utils.test_safe_cast import BaseSafeCast
from dbt.tests.adapter.utils.test_split_part import BaseSplitPart
from dbt.tests.adapter.utils.test_string_literal import BaseStringLiteral
class TestAnyValue(BaseAnyValue):
pass
@pytest.mark.skip("arrays not supported in SQLite")
class TestArrayAppend(BaseArrayAppend):
pass
@pytest.mark.skip("arrays not supported in SQLite")
class TestArrayConcat(BaseArrayConcat):
pass
@pytest.mark.skip("arrays not supported in SQLite")
class TestArrayConstruct(BaseArrayConstruct):
pass
class TestBoolOr(BaseBoolOr):
pass
class TestCastBoolToText(BaseCastBoolToText):
pass
class TestConcat(BaseConcat):
pass
@pytest.mark.skip("timestamps not supported in SQLite")
class TestCurrentTimestampNaive(BaseCurrentTimestampNaive):
pass
class TestDateAdd(BaseDateAdd):
pass
class BaseDateDiff(BaseUtils):
models__test_datediff_sql = """
with data as (
select * from {{ ref('data_datediff') }}
)
select
case
when datepart = 'second' then {{ datediff('first_date', 'second_date', 'second') }}
when datepart = 'minute' then {{ datediff('first_date', 'second_date', 'minute') }}
when datepart = 'hour' then {{ datediff('first_date', 'second_date', 'hour') }}
when datepart = 'day' then {{ datediff('first_date', 'second_date', 'day') }}
when datepart = 'week' then {{ datediff('first_date', 'second_date', 'week') }}
when datepart = 'month' then {{ datediff('first_date', 'second_date', 'month') }}
when datepart = 'year' then {{ datediff('first_date', 'second_date', 'year') }}
else null
end as actual,
result as expected
from data
-- Also test correct casting of literal values.
-- sqlite implementation of datediff doesn't support microsecond or quarter
union all select {{ datediff("'1999-12-31 23:59:59.999999'", "'2000-01-01 00:00:00.000000'", "second") }} as actual, 1 as expected
union all select {{ datediff("'1999-12-31 23:59:59.999999'", "'2000-01-01 00:00:00.000000'", "minute") }} as actual, 1 as expected
union all select {{ datediff("'1999-12-31 23:59:59.999999'", "'2000-01-01 00:00:00.000000'", "hour") }} as actual, 1 as expected
union all select {{ datediff("'1999-12-31 23:59:59.999999'", "'2000-01-01 00:00:00.000000'", "day") }} as actual, 1 as expected
union all select {{ datediff("'1999-12-31 23:59:59.999999'", "'2000-01-03 00:00:00.000000'", "week") }} as actual, 1 as expected
union all select {{ datediff("'1999-12-31 23:59:59.999999'", "'2000-01-01 00:00:00.000000'", "month") }} as actual, 1 as expected
union all select {{ datediff("'1999-12-31 23:59:59.999999'", "'2000-01-01 00:00:00.000000'", "year") }} as actual, 1 as expected
"""
@pytest.fixture(scope="class")
def seeds(self):
return {"data_datediff.csv": seeds__data_datediff_csv}
@pytest.fixture(scope="class")
def models(self):
return {
"test_datediff.yml": models__test_datediff_yml,
"test_datediff.sql": self.interpolate_macro_namespace(
self.models__test_datediff_sql, "datediff"
),
}
@pytest.mark.skip("TODO: implement datediff")
class TestDateDiff(BaseDateDiff):
pass
class TestDateTrunc(BaseUtils):
seeds__data_date_trunc_csv = """date_to_trunc,year,quarter,month,week,day,hour,minute,second
1999-12-31 23:59:59.999999,1999-01-01 00:00:00,1999-10-01 00:00:00,1999-12-01 00:00:00,1999-12-26 00:00:00,1999-12-31 00:00:00,1999-12-31 23:00:00,1999-12-31 23:59:00,1999-12-31 23:59:59
1999-12-31,1999-01-01 00:00:00,1999-10-01 00:00:00,1999-12-01 00:00:00,1999-12-26 00:00:00,1999-12-31 00:00:00,1999-12-31 00:00:00,1999-12-31 00:00:00,1999-12-31 00:00:00
1999-01-01,1999-01-01 00:00:00,1999-01-01 00:00:00,1999-01-01 00:00:00,1998-12-27 00:00:00,1999-01-01 00:00:00,1999-01-01 00:00:00,1999-01-01 00:00:00,1999-01-01 00:00:00
1999-05-16 12:21,1999-01-01 00:00:00,1999-04-01 00:00:00,1999-05-01 00:00:00,1999-05-16 00:00:00,1999-05-16 00:00:00,1999-05-16 12:00:00,1999-05-16 12:21:00,1999-05-16 12:21:00
"""
models__test_date_trunc_sql = """
with data as (
select * from {{ ref('data_date_trunc') }}
)
""" + " union all ".join(
"""
select
{{{{ date_trunc("{datepart}", "date_to_trunc") }}}} as actual,
{datepart} as expected
from data""".format(
datepart=datepart
)
for datepart in [
"year",
"quarter",
"month",
"week",
"day",
"hour",
"minute",
"second",
]
)
@pytest.fixture(scope="class")
def seeds(self):
return {"data_date_trunc.csv": self.seeds__data_date_trunc_csv}
@pytest.fixture(scope="class")
def models(self):
return {
"test_date_trunc.yml": models__test_date_trunc_yml,
"test_date_trunc.sql": self.interpolate_macro_namespace(
self.models__test_date_trunc_sql, "date_trunc"
),
}
class TestEscapeSingleQuotes(BaseEscapeSingleQuotesQuote):
pass
class TestExcept(BaseExcept):
pass
class TestHash(BaseHash):
pass
class TestIntersect(BaseIntersect):
pass
@pytest.mark.skip("TODO: implement lastday")
class TestLastDay(BaseLastDay):
pass
class TestLength(BaseLength):
pass
@pytest.mark.skip("TODO: implement listagg")
class TestListagg(BaseListagg):
pass
class TestPosition(BasePosition):
pass
class TestReplace(BaseReplace):
pass
class TestRight(BaseRight):
pass
class TestSafeCast(BaseSafeCast):
pass
class TestSplitPart(BaseSplitPart):
pass
class TestStringLiteral(BaseStringLiteral):
pass