@@ -17,6 +17,14 @@ import (
1717 "github.com/stretchr/testify/assert"
1818)
1919
20+ func anyArgs (i int ) []any {
21+ args := make ([]any , i )
22+ for j := range i {
23+ args [j ] = pgxmock .AnyArg ()
24+ }
25+ return args
26+ }
27+
2028func TestExecuteSchemaScripts (t * testing.T ) {
2129 initmockdb (t )
2230 defer mockPool .Close ()
@@ -146,6 +154,87 @@ func TestTryLockClientName(t *testing.T) {
146154 })
147155}
148156
157+ func TestCreateChainFromYamlErrors (t * testing.T ) {
158+ initmockdb (t )
159+ defer mockPool .Close ()
160+ mockpge := pgengine .NewDB (mockPool , "pgengine_unit_test" )
161+
162+ t .Run ("Database error during chain creation" , func (t * testing.T ) {
163+ mockPool .ExpectQuery (`INSERT INTO timetable.chain` ).
164+ WithArgs (anyArgs (9 )... ).
165+ WillReturnError (fmt .Errorf ("simulated DB error" ))
166+ _ , err := mockpge .CreateChainFromYaml (ctx , & pgengine.YamlChain {})
167+ assert .Error (t , err )
168+ assert .NoError (t , mockPool .ExpectationsWereMet ())
169+ })
170+
171+ t .Run ("Database error during task creation" , func (t * testing.T ) {
172+ mockPool .ExpectQuery (`INSERT INTO timetable.chain` ).
173+ WithArgs (anyArgs (9 )... ).
174+ WillReturnRows (pgxmock .NewRows ([]string {"chain_id" }).AddRow (1 ))
175+ mockPool .ExpectQuery (`INSERT INTO timetable.task` ).
176+ WithArgs (anyArgs (10 )... ).
177+ WillReturnError (fmt .Errorf ("simulated DB error on task" ))
178+
179+ _ , err := mockpge .CreateChainFromYaml (ctx , & pgengine.YamlChain {
180+ Chain : pgengine.Chain {ChainName : "test-chain" },
181+ Schedule : "0 0 * * *" ,
182+ Tasks : []pgengine.YamlTask {
183+ {ChainTask : pgengine.ChainTask {Command : "SELECT 1" , Kind : "SQL" }},
184+ },
185+ })
186+ assert .Error (t , err )
187+ assert .NoError (t , mockPool .ExpectationsWereMet ())
188+ })
189+
190+ t .Run ("Database error during parameter unmarshalling" , func (t * testing.T ) {
191+ mockPool .ExpectQuery (`INSERT INTO timetable.chain` ).
192+ WithArgs (anyArgs (9 )... ).
193+ WillReturnRows (pgxmock .NewRows ([]string {"chain_id" }).AddRow (1 ))
194+ mockPool .ExpectQuery (`INSERT INTO timetable.task` ).
195+ WithArgs (anyArgs (10 )... ).
196+ WillReturnRows (pgxmock .NewRows ([]string {"task_id" }).AddRow (1 ))
197+
198+ _ , err := mockpge .CreateChainFromYaml (ctx , & pgengine.YamlChain {
199+ Chain : pgengine.Chain {ChainName : "test-chain" },
200+ Schedule : "0 0 * * *" ,
201+ Tasks : []pgengine.YamlTask {
202+ {
203+ ChainTask : pgengine.ChainTask {Command : "SELECT 1" , Kind : "SQL" },
204+ Parameters : []any {func () {}}, // functions cannot be marshalled to JSON
205+ },
206+ },
207+ })
208+ assert .Error (t , err )
209+ assert .NoError (t , mockPool .ExpectationsWereMet ())
210+ })
211+
212+ t .Run ("Database error during parameter creation" , func (t * testing.T ) {
213+ mockPool .ExpectQuery (`INSERT INTO timetable.chain` ).
214+ WithArgs (anyArgs (9 )... ).
215+ WillReturnRows (pgxmock .NewRows ([]string {"chain_id" }).AddRow (1 ))
216+ mockPool .ExpectQuery (`INSERT INTO timetable.task` ).
217+ WithArgs (anyArgs (10 )... ).
218+ WillReturnRows (pgxmock .NewRows ([]string {"task_id" }).AddRow (1 ))
219+ mockPool .ExpectExec (`INSERT INTO timetable.parameter` ).
220+ WithArgs (anyArgs (3 )... ).
221+ WillReturnError (fmt .Errorf ("simulated DB error on parameter" ))
222+
223+ _ , err := mockpge .CreateChainFromYaml (ctx , & pgengine.YamlChain {
224+ Chain : pgengine.Chain {ChainName : "test-chain" },
225+ Schedule : "0 0 * * *" ,
226+ Tasks : []pgengine.YamlTask {
227+ {
228+ ChainTask : pgengine.ChainTask {Command : "SELECT 1" , Kind : "SQL" },
229+ Parameters : []any {"foo" },
230+ },
231+ },
232+ })
233+ assert .Error (t , err )
234+ assert .NoError (t , mockPool .ExpectationsWereMet ())
235+ })
236+ }
237+
149238func TestExecuteFileScript (t * testing.T ) {
150239 initmockdb (t )
151240 defer mockPool .Close ()
@@ -154,14 +243,6 @@ func TestExecuteFileScript(t *testing.T) {
154243 // Create temporary directory for test files
155244 tmpDir := t .TempDir ()
156245
157- anyArgs := func (i int ) []any {
158- args := make ([]any , i )
159- for j := range i {
160- args [j ] = pgxmock .AnyArg ()
161- }
162- return args
163- }
164-
165246 t .Run ("SQL file execution" , func (t * testing.T ) {
166247 // Create temporary SQL file
167248 sqlFile := filepath .Join (tmpDir , "test.sql" )
0 commit comments