33
33
@pytest .fixture
34
34
def _setup_db (tmp_path ):
35
35
"""Fixture to create old DB."""
36
- def _inner (values , db_file_name = 'sql.db' ):
36
+ def _inner (stmts , db_file_name = 'sql.db' ):
37
37
db_file = tmp_path / db_file_name
38
38
db_file .parent .mkdir (parents = True , exist_ok = True )
39
39
# Note: cannot use CylcWorkflowDAO here as creating outdated DB
@@ -53,8 +53,8 @@ def _inner(values, db_file_name='sql.db'):
53
53
r' job_runner_name TEXT, job_id TEXT,'
54
54
r' PRIMARY KEY(cycle, name, submit_num));'
55
55
))
56
- for value in values :
57
- conn .execute (value )
56
+ for stmt , values in stmts :
57
+ conn .execute (stmt , values )
58
58
conn .execute ((
59
59
r"INSERT INTO task_jobs VALUES"
60
60
r" ('10090101T0000Z', 'foo', 1, 0, 1, '2022-12-05T14:46:06Z',"
@@ -69,13 +69,21 @@ def _inner(values, db_file_name='sql.db'):
69
69
70
70
71
71
def test_upgrade_pre_810_fails_on_multiple_flows (_setup_db ):
72
- values = [(
73
- r'INSERT INTO task_states VALUES'
74
- r" ('foo', '10050101T0000Z', '[1, 3]',"
75
- r" '2022-12-05T14:46:33Z',"
76
- r" '2022-12-05T14:46:40Z', 1, 'succeeded', 0, 0)"
72
+ stmts = [(
73
+ r'INSERT INTO task_states VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)' ,
74
+ (
75
+ 'foo' ,
76
+ '10050101T0000Z' ,
77
+ '[1, 3]' ,
78
+ '2022-12-05T14:46:33Z' ,
79
+ '2022-12-05T14:46:40Z' ,
80
+ 1 ,
81
+ 'succeeded' ,
82
+ 0 ,
83
+ 0 ,
84
+ ),
77
85
)]
78
- db_file_name = _setup_db (values )
86
+ db_file_name = _setup_db (stmts )
79
87
with CylcWorkflowDAO (db_file_name ) as dao , pytest .raises (
80
88
CylcError ,
81
89
match = '^Cannot .* 8.0.x to 8.1.0 .* used.$'
@@ -84,13 +92,21 @@ def test_upgrade_pre_810_fails_on_multiple_flows(_setup_db):
84
92
85
93
86
94
def test_upgrade_pre_810_pass_on_single_flow (_setup_db ):
87
- values = [(
88
- r'INSERT INTO task_states VALUES'
89
- r" ('foo', '10050101T0000Z', '[1]',"
90
- r" '2022-12-05T14:46:33Z',"
91
- r" '2022-12-05T14:46:40Z', 1, 'succeeded', 0, 0)"
95
+ stmts = [(
96
+ r'INSERT INTO task_states VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)' ,
97
+ (
98
+ 'foo' ,
99
+ '10050101T0000Z' ,
100
+ '[1]' ,
101
+ '2022-12-05T14:46:33Z' ,
102
+ '2022-12-05T14:46:40Z' ,
103
+ 1 ,
104
+ 'succeeded' ,
105
+ 0 ,
106
+ 0 ,
107
+ ),
92
108
)]
93
- db_file_name = _setup_db (values )
109
+ db_file_name = _setup_db (stmts )
94
110
with CylcWorkflowDAO (db_file_name ) as dao :
95
111
WorkflowDatabaseManager .upgrade_pre_810 (dao )
96
112
result = dao .connect ().execute (
@@ -104,14 +120,21 @@ def test_check_workflow_db_compat(_setup_db, capsys):
104
120
"""
105
121
# Create public and private databases with different cylc versions:
106
122
create = r'CREATE TABLE workflow_params(key TEXT, value TEXT)'
107
- insert = (
108
- r'INSERT INTO workflow_params VALUES'
109
- r'("cylc_version", "{}")'
110
- )
123
+ insert = r'INSERT INTO workflow_params VALUES (?, ?)'
111
124
pri_path = _setup_db (
112
- [create , insert .format ('7.99.99' )], db_file_name = 'private/db' )
125
+ [
126
+ (create , tuple ()),
127
+ (insert , ('cylc_version' , '7.99.99' )),
128
+ ],
129
+ db_file_name = 'private/db' ,
130
+ )
113
131
pub_path = _setup_db (
114
- [create , insert .format ('7.99.98' )], db_file_name = 'public/db' )
132
+ [
133
+ (create , tuple ()),
134
+ (insert , ('cylc_version' , '7.99.98' )),
135
+ ],
136
+ db_file_name = 'public/db'
137
+ )
115
138
116
139
with pytest .raises (ServiceFileError , match = '99.98' ):
117
140
WorkflowDatabaseManager .check_db_compatibility (pub_path )
@@ -124,11 +147,11 @@ def test_cylc_7_db_wflow_params_table(_setup_db):
124
147
"""Test back-compat needed by workflow state xtrigger for Cylc 7 DBs."""
125
148
ptformat = "CCYY"
126
149
create = r'CREATE TABLE suite_params(key TEXT, value TEXT)'
127
- insert = (
128
- r'INSERT INTO suite_params VALUES'
129
- rf'("cycle_point_format", " { ptformat } ")'
130
- )
131
- db_file_name = _setup_db ([ create , insert ])
150
+ insert = r'INSERT INTO suite_params VALUES (?, ?)'
151
+ db_file_name = _setup_db ([
152
+ ( create , tuple ()),
153
+ ( insert , ( 'cycle_point_format' , ptformat )),
154
+ ])
132
155
with CylcWorkflowDBChecker ('foo' , 'bar' , db_path = db_file_name ) as checker :
133
156
with pytest .raises (
134
157
sqlite3 .OperationalError , match = "no such table: workflow_params"
@@ -145,29 +168,48 @@ def test_pre_830_task_action_timers(_setup_db):
145
168
index 1. TaskPool.load_db_task_action_timers() should be able to
146
169
discard this field.
147
170
"""
148
- values = [
149
- r'''
150
- CREATE TABLE task_action_timers(
151
- cycle TEXT, name TEXT, ctx_key TEXT, ctx TEXT, delays TEXT,
152
- num INTEGER, delay TEXT, timeout TEXT,
153
- PRIMARY KEY(cycle, name, ctx_key)
154
- );
155
- ''' ,
156
- r'''
157
- INSERT INTO task_action_timers VALUES(
158
- '1','foo','[["event-mail", "failed"], 9]',
159
- '["TaskEventMailContext", ["event-mail", "event-mail", "[email protected] ", "jfaden"]]',
160
- '[0.0]',1,'0.0','1709229449.61275'
161
- );
162
- ''' ,
163
- r'''
164
- INSERT INTO task_action_timers VALUES(
165
- '1','foo','["try_timers", "execution-retry"]', null,
166
- '[94608000.0]',1,NULL,NULL
167
- );
168
- ''' ,
171
+ stmts = [
172
+ (
173
+ r'''
174
+ CREATE TABLE task_action_timers(
175
+ cycle TEXT, name TEXT, ctx_key TEXT, ctx TEXT, delays TEXT,
176
+ num INTEGER, delay TEXT, timeout TEXT,
177
+ PRIMARY KEY(cycle, name, ctx_key)
178
+ );
179
+ ''' ,
180
+ tuple (),
181
+ ),
182
+ (
183
+ r'INSERT INTO task_action_timers VALUES (?, ?, ?, ?, ?, ?, ?, ?)' ,
184
+ (
185
+ '1' ,
186
+ 'foo' ,
187
+ '[["event-mail", "failed"], 9]' ,
188
+ (
189
+ '["TaskEventMailContext", ["event-mail", "event-mail",'
190
+ ' "[email protected] ", "jfaden"]]'
191
+ ),
192
+ '[0.0]' ,
193
+ 1 ,
194
+ '0.0' ,
195
+ '1709229449.61275' ,
196
+ )
197
+ ),
198
+ (
199
+ r'INSERT INTO task_action_timers VALUES (?, ?, ?, ?, ?, ?, ?, ?)' ,
200
+ (
201
+ '1' ,
202
+ 'foo' ,
203
+ '["try_timers", "execution-retry"]' ,
204
+ None ,
205
+ '[94608000.0]' ,
206
+ 1 ,
207
+ None ,
208
+ None ,
209
+ ),
210
+ ),
169
211
]
170
- db_file = _setup_db (values )
212
+ db_file = _setup_db (stmts )
171
213
mock_pool = Mock ()
172
214
load_db_task_action_timers = partial (
173
215
TaskPool .load_db_task_action_timers , mock_pool
0 commit comments