2019-07-30 11:45:10 +02:00
package postgres
2019-05-20 17:37:55 +02:00
import (
2021-05-16 18:46:50 +02:00
"context"
2022-05-14 11:17:39 +02:00
"github.com/volatiletech/null/v8"
2021-05-16 18:46:50 +02:00
"testing"
"time"
"github.com/google/uuid"
"github.com/stretchr/testify/require"
2020-06-27 18:48:19 +02:00
"github.com/go-jet/jet/v2/internal/testutils"
. "github.com/go-jet/jet/v2/postgres"
"github.com/go-jet/jet/v2/qrm"
"github.com/go-jet/jet/v2/tests/.gentestdata/jetdb/dvds/model"
. "github.com/go-jet/jet/v2/tests/.gentestdata/jetdb/dvds/table"
2019-05-20 17:37:55 +02:00
)
2020-05-09 10:49:09 +02:00
var oneInventoryQuery = Inventory .
2019-05-20 17:37:55 +02:00
SELECT ( Inventory . AllColumns ) .
LIMIT ( 1 ) .
ORDER_BY ( Inventory . InventoryID )
func TestScanToInvalidDestination ( t * testing . T ) {
t . Run ( "nil dest" , func ( t * testing . T ) {
2020-05-09 10:49:09 +02:00
testutils . AssertQueryPanicErr ( t , oneInventoryQuery , db , nil , "jet: destination is nil" )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "struct dest" , func ( t * testing . T ) {
2020-05-09 10:49:09 +02:00
testutils . AssertQueryPanicErr ( t , oneInventoryQuery , db , struct { } { } , "jet: destination has to be a pointer to slice or pointer to struct" )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "slice dest" , func ( t * testing . T ) {
2020-05-09 10:49:09 +02:00
testutils . AssertQueryPanicErr ( t , oneInventoryQuery , db , [ ] struct { } { } , "jet: destination has to be a pointer to slice or pointer to struct" )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "slice of pointers to pointer dest" , func ( t * testing . T ) {
2020-05-09 10:49:09 +02:00
testutils . AssertQueryPanicErr ( t , oneInventoryQuery , db , [ ] * * struct { } { } , "jet: destination has to be a pointer to slice or pointer to struct" )
2019-05-20 17:37:55 +02:00
} )
2019-08-13 17:20:35 +02:00
t . Run ( "map dest" , func ( t * testing . T ) {
2020-05-09 10:49:09 +02:00
testutils . AssertQueryPanicErr ( t , oneInventoryQuery , db , & map [ string ] string { } , "jet: destination has to be a pointer to slice or pointer to struct" )
2019-08-13 17:20:35 +02:00
} )
2019-05-20 17:37:55 +02:00
t . Run ( "map dest" , func ( t * testing . T ) {
2020-05-09 10:49:09 +02:00
testutils . AssertQueryPanicErr ( t , oneInventoryQuery , db , [ ] map [ string ] string { } , "jet: destination has to be a pointer to slice or pointer to struct" )
2019-05-20 17:37:55 +02:00
} )
2019-08-13 17:20:35 +02:00
t . Run ( "map dest" , func ( t * testing . T ) {
2020-05-09 10:49:09 +02:00
testutils . AssertQueryPanicErr ( t , oneInventoryQuery , db , & [ ] map [ string ] string { } , "jet: unsupported slice element type" )
2019-08-13 17:20:35 +02:00
} )
2019-05-20 17:37:55 +02:00
}
func TestScanToValidDestination ( t * testing . T ) {
t . Run ( "pointer to struct" , func ( t * testing . T ) {
2019-10-10 16:09:44 +02:00
dest := [ ] struct { } { }
2020-05-09 10:49:09 +02:00
err := oneInventoryQuery . Query ( db , & dest )
2019-05-20 17:37:55 +02:00
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2019-05-20 17:37:55 +02:00
} )
2019-08-13 17:20:35 +02:00
t . Run ( "global query function scan" , func ( t * testing . T ) {
2020-05-09 10:49:09 +02:00
queryStr , args := oneInventoryQuery . Sql ( )
2019-10-10 16:09:44 +02:00
dest := [ ] struct { } { }
2022-01-12 19:03:50 +01:00
rowProcessed , err := qrm . Query ( nil , db , queryStr , args , & dest )
require . Equal ( t , rowProcessed , int64 ( 1 ) )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2019-08-13 17:20:35 +02:00
} )
2019-05-20 17:37:55 +02:00
t . Run ( "pointer to slice" , func ( t * testing . T ) {
2020-05-09 10:49:09 +02:00
err := oneInventoryQuery . Query ( db , & [ ] struct { } { } )
2019-05-20 17:37:55 +02:00
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "pointer to slice of pointer to structs" , func ( t * testing . T ) {
2020-05-09 10:49:09 +02:00
err := oneInventoryQuery . Query ( db , & [ ] * struct { } { } )
2019-05-20 17:37:55 +02:00
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2019-05-20 17:37:55 +02:00
} )
2021-10-15 17:43:10 +02:00
t . Run ( "pointer to slice of integers" , func ( t * testing . T ) {
var dest [ ] int32
2019-05-22 11:28:32 +02:00
2021-10-15 17:43:10 +02:00
err := oneInventoryQuery . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2021-10-15 17:43:10 +02:00
require . Equal ( t , dest [ 0 ] , int32 ( 1 ) )
2019-05-22 11:28:32 +02:00
} )
2021-10-15 17:43:10 +02:00
t . Run ( "pointer to slice integer pointers" , func ( t * testing . T ) {
var dest [ ] * int32
2019-05-20 17:37:55 +02:00
2021-10-15 17:43:10 +02:00
err := oneInventoryQuery . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2024-10-05 12:32:03 -04:00
require . Equal ( t , dest [ 0 ] , testutils . PtrOf ( int32 ( 1 ) ) )
2021-10-15 17:43:10 +02:00
} )
t . Run ( "NULL to integer" , func ( t * testing . T ) {
var dest struct {
Int64 int64
UInt64 uint64
}
err := SELECT ( NULL . AS ( "int64" ) , NULL . AS ( "uint64" ) ) . Query ( db , & dest )
require . NoError ( t , err )
require . Equal ( t , dest . Int64 , int64 ( 0 ) )
require . Equal ( t , dest . UInt64 , uint64 ( 0 ) )
2019-05-20 17:37:55 +02:00
} )
}
func TestScanToStruct ( t * testing . T ) {
query := Inventory .
SELECT ( Inventory . AllColumns ) .
ORDER_BY ( Inventory . InventoryID )
2021-03-21 17:17:44 +01:00
//fmt.Println(query.DebugSql())
2019-08-13 17:20:35 +02:00
2019-05-20 17:37:55 +02:00
t . Run ( "one struct" , func ( t * testing . T ) {
dest := model . Inventory { }
err := query . LIMIT ( 1 ) . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , inventory1 , dest )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "multiple structs, just first one used" , func ( t * testing . T ) {
dest := model . Inventory { }
err := query . LIMIT ( 10 ) . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , inventory1 , dest )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "one struct" , func ( t * testing . T ) {
dest := struct {
model . Inventory
} { }
err := query . LIMIT ( 1 ) . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , inventory1 , dest . Inventory )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "one struct" , func ( t * testing . T ) {
dest := struct {
* model . Inventory
} { }
err := query . LIMIT ( 1 ) . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , inventory1 , * dest . Inventory )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "invalid dest" , func ( t * testing . T ) {
dest := struct {
Inventory * * model . Inventory
} { }
2019-08-13 13:57:26 +02:00
testutils . AssertQueryPanicErr ( t , query , db , & dest , "jet: unsupported dest type: Inventory **model.Inventory" )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "invalid dest 2" , func ( t * testing . T ) {
dest := struct {
Inventory * * * model . Inventory
} { }
2019-08-13 13:57:26 +02:00
testutils . AssertQueryPanicErr ( t , query , db , & dest , "jet: unsupported dest type: Inventory ***model.Inventory" )
2019-05-20 17:37:55 +02:00
} )
2019-05-21 17:34:43 +02:00
t . Run ( "custom struct" , func ( t * testing . T ) {
type Inventory struct {
2019-06-26 10:30:31 +02:00
InventoryID * int32 ` sql:"primary_key" `
2019-05-21 17:34:43 +02:00
FilmID int16
StoreID * int16
}
dest := Inventory { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2019-05-21 17:34:43 +02:00
2020-05-09 11:00:22 +02:00
require . Equal ( t , * dest . InventoryID , int32 ( 1 ) )
require . Equal ( t , dest . FilmID , int16 ( 1 ) )
require . Equal ( t , * dest . StoreID , int16 ( 1 ) )
2019-05-21 17:34:43 +02:00
} )
2019-07-29 18:08:53 +02:00
t . Run ( "type convert int32 to int" , func ( t * testing . T ) {
2019-05-22 11:28:32 +02:00
type Inventory struct {
InventoryID int
FilmID string
}
dest := Inventory { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2019-05-22 11:28:32 +02:00
} )
t . Run ( "type mismatch scanner type" , func ( t * testing . T ) {
type Inventory struct {
InventoryID uuid . UUID
FilmID string
}
dest := Inventory { }
2021-10-15 17:43:10 +02:00
err := query . Query ( db , & dest )
require . Error ( t , err )
require . EqualError ( t , err , "jet: can't scan int64('\\x01') to 'InventoryID uuid.UUID': Scan: unable to scan type int64 into UUID" )
2019-05-22 11:28:32 +02:00
} )
2019-08-13 17:20:35 +02:00
t . Run ( "type mismatch base type" , func ( t * testing . T ) {
type Inventory struct {
InventoryID int32
FilmID bool
}
dest := [ ] Inventory { }
2021-10-15 17:43:10 +02:00
err := query . OFFSET ( 10 ) . Query ( db , & dest )
require . Error ( t , err )
require . EqualError ( t , err , "jet: can't assign int64('\\x02') to 'FilmID bool': can't assign int64(2) to bool" )
2019-08-13 17:20:35 +02:00
} )
2019-05-20 17:37:55 +02:00
}
func TestScanToNestedStruct ( t * testing . T ) {
query := Inventory .
2019-05-29 14:03:38 +02:00
INNER_JOIN ( Film , Inventory . FilmID . EQ ( Film . FilmID ) ) .
INNER_JOIN ( Store , Inventory . StoreID . EQ ( Store . StoreID ) ) .
2019-05-20 17:37:55 +02:00
SELECT ( Inventory . AllColumns , Film . AllColumns , Store . AllColumns ) .
2019-05-29 14:03:38 +02:00
WHERE ( Inventory . InventoryID . EQ ( Int ( 1 ) ) )
2019-05-20 17:37:55 +02:00
t . Run ( "embedded structs" , func ( t * testing . T ) {
dest := struct {
model . Inventory
model . Film
model . Store
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , dest . Film , film1 )
testutils . AssertDeepEqual ( t , dest . Store , store1 )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "embedded pointer structs" , func ( t * testing . T ) {
dest := struct {
* model . Inventory
* model . Film
* model . Store
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , * dest . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , * dest . Film , film1 )
testutils . AssertDeepEqual ( t , * dest . Store , store1 )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "embedded unused structs" , func ( t * testing . T ) {
dest := struct {
model . Inventory
model . Actor //unused
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , dest . Actor , model . Actor { } )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "embedded unused pointer structs" , func ( t * testing . T ) {
dest := struct {
model . Inventory
* model . Actor //unused
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , dest . Actor , ( * model . Actor ) ( nil ) )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "embedded unused pointer structs" , func ( t * testing . T ) {
dest := struct {
model . Inventory
Actor * model . Actor //unused
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , dest . Actor , ( * model . Actor ) ( nil ) )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "embedded pointer to selected column" , func ( t * testing . T ) {
query := Inventory .
2019-05-29 14:03:38 +02:00
INNER_JOIN ( Film , Inventory . FilmID . EQ ( Film . FilmID ) ) .
INNER_JOIN ( Store , Inventory . StoreID . EQ ( Store . StoreID ) ) .
2019-06-04 11:52:37 +02:00
SELECT ( Inventory . AllColumns , Film . AllColumns , Store . AllColumns , String ( "" ) . AS ( "actor.first_name" ) ) .
2019-05-29 14:03:38 +02:00
WHERE ( Inventory . InventoryID . EQ ( Int ( 1 ) ) )
2019-05-20 17:37:55 +02:00
dest := struct {
model . Inventory
Actor * model . Actor //unused
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Inventory , inventory1 )
2020-05-09 11:00:22 +02:00
require . True ( t , dest . Actor != nil )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "struct embedded unused pointer" , func ( t * testing . T ) {
dest := struct {
model . Inventory
Actor * struct {
model . Actor
} //unused
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , dest . Actor , ( * struct { model . Actor } ) ( nil ) )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "multiple embedded unused pointer" , func ( t * testing . T ) {
dest := struct {
model . Inventory
Actor * struct {
model . Actor //unused
model . Language //unesed
}
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , dest . Actor , ( * struct {
2019-05-20 17:37:55 +02:00
model . Actor
model . Language
} ) ( nil ) )
} )
t . Run ( "field not nil, embedded selected model" , func ( t * testing . T ) {
dest := struct {
model . Inventory
Actor * struct {
model . Actor //unselected
model . Film //selected
}
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Inventory , inventory1 )
2020-05-09 11:00:22 +02:00
require . True ( t , dest . Actor != nil )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Actor . Actor , model . Actor { } )
testutils . AssertDeepEqual ( t , dest . Actor . Film , film1 )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "field not nil, deeply nested selected model" , func ( t * testing . T ) {
dest := struct {
model . Inventory
Actor * struct {
model . Actor //unselected
Film * struct {
* model . Film //selected
}
}
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Inventory , inventory1 )
2020-05-09 11:00:22 +02:00
require . True ( t , dest . Actor != nil )
require . True ( t , dest . Actor . Film != nil )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Actor . Film . Film , & film1 )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "embedded structs" , func ( t * testing . T ) {
query := Inventory .
2019-05-29 14:03:38 +02:00
INNER_JOIN ( Film , Inventory . FilmID . EQ ( Film . FilmID ) ) .
INNER_JOIN ( Store , Inventory . StoreID . EQ ( Store . StoreID ) ) .
INNER_JOIN ( Language , Film . LanguageID . EQ ( Language . LanguageID ) ) .
2019-05-20 17:37:55 +02:00
SELECT ( Inventory . AllColumns , Film . AllColumns , Store . AllColumns , Language . AllColumns ) .
2019-05-29 14:03:38 +02:00
WHERE ( Inventory . InventoryID . EQ ( Int ( 1 ) ) )
2019-05-20 17:37:55 +02:00
2019-06-12 12:47:30 +02:00
type Language3 model . Language
2019-05-20 17:37:55 +02:00
dest := struct {
model . Inventory
Film struct {
model . Film
Language model . Language
2019-06-26 10:30:31 +02:00
Language2 * model . Language ` alias:"Language.*" `
Language3 * Language3 ` alias:"language" `
2019-05-20 17:37:55 +02:00
Lang struct {
model . Language
}
Lang2 * struct {
model . Language
}
}
Store model . Store
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , dest . Film . Film , film1 )
testutils . AssertDeepEqual ( t , dest . Store , store1 )
testutils . AssertDeepEqual ( t , dest . Film . Language , language1 )
testutils . AssertDeepEqual ( t , dest . Film . Lang . Language , language1 )
testutils . AssertDeepEqual ( t , dest . Film . Lang2 . Language , language1 )
testutils . AssertDeepEqual ( t , dest . Film . Language2 , & language1 )
testutils . AssertDeepEqual ( t , model . Language ( * dest . Film . Language3 ) , language1 )
2019-05-20 17:37:55 +02:00
} )
}
func TestScanToSlice ( t * testing . T ) {
t . Run ( "slice of structs" , func ( t * testing . T ) {
query := Inventory .
SELECT ( Inventory . AllColumns ) .
ORDER_BY ( Inventory . InventoryID ) .
LIMIT ( 10 )
2019-05-21 13:11:45 +02:00
t . Run ( "slice od inventory" , func ( t * testing . T ) {
dest := [ ] model . Inventory { }
2019-05-20 17:37:55 +02:00
2019-05-21 13:11:45 +02:00
err := query . Query ( db , & dest )
2019-05-20 17:37:55 +02:00
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
require . Equal ( t , len ( dest ) , 10 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 0 ] , inventory1 )
testutils . AssertDeepEqual ( t , dest [ 1 ] , inventory2 )
2019-05-21 13:11:45 +02:00
} )
t . Run ( "slice of ints" , func ( t * testing . T ) {
var dest [ ] int32
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest , [ ] int32 { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } )
2019-05-21 13:11:45 +02:00
} )
2019-05-22 11:28:32 +02:00
2019-08-13 17:20:35 +02:00
t . Run ( "slice type convertible" , func ( t * testing . T ) {
2019-05-22 11:28:32 +02:00
var dest [ ] int
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2019-08-13 17:20:35 +02:00
} )
t . Run ( "slice type mismatch" , func ( t * testing . T ) {
var dest [ ] bool
2021-10-15 17:43:10 +02:00
err := query . Query ( db , & dest )
require . Error ( t , err )
require . EqualError ( t , err , ` jet: can't append int64 to []bool slice: can't assign int64(2) to bool ` )
2019-05-22 11:28:32 +02:00
} )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "slice of complex structs" , func ( t * testing . T ) {
query := Inventory .
2019-05-29 14:03:38 +02:00
INNER_JOIN ( Film , Inventory . FilmID . EQ ( Film . FilmID ) ) .
INNER_JOIN ( Store , Inventory . StoreID . EQ ( Store . StoreID ) ) .
2019-06-26 10:30:31 +02:00
SELECT (
Inventory . AllColumns ,
Film . AllColumns ,
Store . AllColumns ,
) .
2019-05-20 17:37:55 +02:00
ORDER_BY ( Inventory . InventoryID ) .
LIMIT ( 10 )
2019-05-21 13:11:45 +02:00
t . Run ( "struct with slice of ints" , func ( t * testing . T ) {
var dest struct {
model . Film
2019-06-26 10:30:31 +02:00
IDs [ ] int32 ` alias:"inventory.inventory_id" `
2019-05-21 13:11:45 +02:00
}
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest . Film , film1 )
testutils . AssertDeepEqual ( t , dest . IDs , [ ] int32 { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 } )
2019-05-21 13:11:45 +02:00
} )
t . Run ( "slice of structs with slice of ints" , func ( t * testing . T ) {
var dest [ ] struct {
model . Film
2019-07-03 16:27:14 +02:00
IDs [ ] int32 ` alias:"inventory.inventory_id" `
2019-05-21 13:11:45 +02:00
}
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
require . Equal ( t , len ( dest ) , 2 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 0 ] . Film , film1 )
testutils . AssertDeepEqual ( t , dest [ 0 ] . IDs , [ ] int32 { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 } )
testutils . AssertDeepEqual ( t , dest [ 1 ] . Film , film2 )
testutils . AssertDeepEqual ( t , dest [ 1 ] . IDs , [ ] int32 { 9 , 10 } )
2019-05-21 13:11:45 +02:00
} )
t . Run ( "slice of structs with slice of pointer to ints" , func ( t * testing . T ) {
var dest [ ] struct {
model . Film
2019-07-03 16:27:14 +02:00
IDs [ ] * int32 ` alias:"inventory.inventory_id" `
2019-05-21 13:11:45 +02:00
}
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
require . Equal ( t , len ( dest ) , 2 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 0 ] . Film , film1 )
2024-10-05 12:32:03 -04:00
testutils . AssertDeepEqual ( t , dest [ 0 ] . IDs , [ ] * int32 { testutils . PtrOf ( int32 ( 1 ) ) , testutils . PtrOf ( int32 ( 2 ) ) , testutils . PtrOf ( int32 ( 3 ) ) , testutils . PtrOf ( int32 ( 4 ) ) ,
testutils . PtrOf ( int32 ( 5 ) ) , testutils . PtrOf ( int32 ( 6 ) ) , testutils . PtrOf ( int32 ( 7 ) ) , testutils . PtrOf ( int32 ( 8 ) ) } )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 1 ] . Film , film2 )
2024-10-05 12:32:03 -04:00
testutils . AssertDeepEqual ( t , dest [ 1 ] . IDs , [ ] * int32 { testutils . PtrOf ( int32 ( 9 ) ) , testutils . PtrOf ( int32 ( 10 ) ) } )
2019-05-21 13:11:45 +02:00
} )
2019-05-20 17:37:55 +02:00
t . Run ( "complex struct 1" , func ( t * testing . T ) {
dest := [ ] struct {
model . Inventory
model . Film
model . Store
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
require . Equal ( t , len ( dest ) , 10 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 0 ] . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , dest [ 0 ] . Film , film1 )
testutils . AssertDeepEqual ( t , dest [ 0 ] . Store , store1 )
2019-05-20 17:37:55 +02:00
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 1 ] . Inventory , inventory2 )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "complex struct 2" , func ( t * testing . T ) {
var dest [ ] struct {
* model . Inventory
model . Film
* model . Store
}
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
require . Equal ( t , len ( dest ) , 10 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 0 ] . Inventory , & inventory1 )
testutils . AssertDeepEqual ( t , dest [ 0 ] . Film , film1 )
testutils . AssertDeepEqual ( t , dest [ 0 ] . Store , & store1 )
2019-05-20 17:37:55 +02:00
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 1 ] . Inventory , & inventory2 )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "complex struct 3" , func ( t * testing . T ) {
var dest [ ] struct {
Inventory model . Inventory
Film * model . Film
Store struct {
* model . Store
}
}
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
require . Equal ( t , len ( dest ) , 10 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 0 ] . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , dest [ 0 ] . Film , & film1 )
testutils . AssertDeepEqual ( t , dest [ 0 ] . Store . Store , & store1 )
2019-05-20 17:37:55 +02:00
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 1 ] . Inventory , inventory2 )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "complex struct 4" , func ( t * testing . T ) {
var dest [ ] struct {
model . Film
Inventories [ ] struct {
model . Inventory
model . Store
}
}
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
require . Equal ( t , len ( dest ) , 2 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 0 ] . Film , film1 )
testutils . AssertDeepEqual ( t , len ( dest [ 0 ] . Inventories ) , 8 )
testutils . AssertDeepEqual ( t , dest [ 0 ] . Inventories [ 0 ] . Inventory , inventory1 )
testutils . AssertDeepEqual ( t , dest [ 0 ] . Inventories [ 0 ] . Store , store1 )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "complex struct 5" , func ( t * testing . T ) {
var dest [ ] struct {
model . Film
Inventories [ ] struct {
model . Inventory
Rentals * [ ] model . Rental
Rentals2 [ ] model . Rental
}
}
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2019-05-20 17:37:55 +02:00
2020-05-09 11:00:22 +02:00
require . Equal ( t , len ( dest ) , 2 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 0 ] . Film , film1 )
2020-05-09 11:00:22 +02:00
require . Equal ( t , len ( dest [ 0 ] . Inventories ) , 8 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 0 ] . Inventories [ 0 ] . Inventory , inventory1 )
2020-05-09 11:00:22 +02:00
require . True ( t , dest [ 0 ] . Inventories [ 0 ] . Rentals == nil )
require . True ( t , dest [ 0 ] . Inventories [ 0 ] . Rentals2 == nil )
2019-05-20 17:37:55 +02:00
} )
} )
t . Run ( "slice of complex structs 2" , func ( t * testing . T ) {
query := Country .
2019-05-29 14:03:38 +02:00
INNER_JOIN ( City , City . CountryID . EQ ( Country . CountryID ) ) .
INNER_JOIN ( Address , Address . CityID . EQ ( City . CityID ) ) .
INNER_JOIN ( Customer , Customer . AddressID . EQ ( Address . AddressID ) ) .
2019-05-20 17:37:55 +02:00
SELECT ( Country . AllColumns , City . AllColumns , Address . AllColumns , Customer . AllColumns ) .
ORDER_BY ( Country . CountryID . ASC ( ) , City . CityID . ASC ( ) , Address . AddressID . ASC ( ) , Customer . CustomerID . ASC ( ) ) .
LIMIT ( 1000 )
t . Run ( "dest1" , func ( t * testing . T ) {
var dest [ ] struct {
model . Country
Cities [ ] struct {
model . City
Adresses [ ] struct {
model . Address
Customer model . Customer
}
}
}
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
require . Equal ( t , len ( dest ) , 108 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 100 ] . Country , countryUk )
2020-05-09 11:00:22 +02:00
require . Equal ( t , len ( dest [ 100 ] . Cities ) , 8 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 100 ] . Cities [ 2 ] . City , cityLondon )
2020-05-09 11:00:22 +02:00
require . Equal ( t , len ( dest [ 100 ] . Cities [ 2 ] . Adresses ) , 2 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 100 ] . Cities [ 2 ] . Adresses [ 0 ] . Address , address256 )
testutils . AssertDeepEqual ( t , dest [ 100 ] . Cities [ 2 ] . Adresses [ 0 ] . Customer , customer256 )
testutils . AssertDeepEqual ( t , dest [ 100 ] . Cities [ 2 ] . Adresses [ 1 ] . Address , addres517 )
testutils . AssertDeepEqual ( t , dest [ 100 ] . Cities [ 2 ] . Adresses [ 1 ] . Customer , customer512 )
2019-05-20 17:37:55 +02:00
} )
t . Run ( "dest1" , func ( t * testing . T ) {
var dest [ ] * struct {
* model . Country
Cities [ ] * struct {
* model . City
Adresses * [ ] * struct {
* model . Address
Customer * model . Customer
}
}
}
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
require . Equal ( t , len ( dest ) , 108 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 100 ] . Country , & countryUk )
2020-05-09 11:00:22 +02:00
require . Equal ( t , len ( dest [ 100 ] . Cities ) , 8 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest [ 100 ] . Cities [ 2 ] . City , & cityLondon )
2020-05-09 11:00:22 +02:00
require . Equal ( t , len ( * dest [ 100 ] . Cities [ 2 ] . Adresses ) , 2 )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , ( * dest [ 100 ] . Cities [ 2 ] . Adresses ) [ 0 ] . Address , & address256 )
testutils . AssertDeepEqual ( t , ( * dest [ 100 ] . Cities [ 2 ] . Adresses ) [ 0 ] . Customer , & customer256 )
testutils . AssertDeepEqual ( t , ( * dest [ 100 ] . Cities [ 2 ] . Adresses ) [ 1 ] . Address , & addres517 )
testutils . AssertDeepEqual ( t , ( * dest [ 100 ] . Cities [ 2 ] . Adresses ) [ 1 ] . Customer , & customer512 )
2019-05-20 17:37:55 +02:00
} )
} )
t . Run ( "dest1" , func ( t * testing . T ) {
var dest [ ] * struct {
* model . Country
Cities [ ] * * struct {
* model . City
}
}
2020-05-09 10:49:09 +02:00
testutils . AssertQueryPanicErr ( t , oneInventoryQuery , db , & dest , "jet: unsupported slice element type at 'Cities []**struct { *model.City }'" )
2019-05-20 17:37:55 +02:00
} )
}
2019-10-12 18:45:09 +02:00
func TestStructScanErrNoRows ( t * testing . T ) {
query := SELECT ( Customer . AllColumns ) .
FROM ( Customer ) .
WHERE ( Customer . CustomerID . EQ ( Int ( - 1 ) ) )
customer := model . Customer { }
err := query . Query ( db , & customer )
2020-05-09 11:00:22 +02:00
require . Error ( t , err , qrm . ErrNoRows . Error ( ) )
2019-10-12 18:45:09 +02:00
}
func TestStructScanAllNull ( t * testing . T ) {
query := SELECT ( NULL . AS ( "null1" ) , NULL . AS ( "null2" ) )
dest := struct {
Null1 * int
Null2 * int
} { }
err := query . Query ( db , & dest )
2020-05-09 11:00:22 +02:00
require . NoError ( t , err )
2020-02-11 10:25:13 +01:00
testutils . AssertDeepEqual ( t , dest , struct {
2019-10-12 18:45:09 +02:00
Null1 * int
Null2 * int
} { } )
}
2021-05-16 18:46:50 +02:00
func TestRowsScan ( t * testing . T ) {
stmt := SELECT (
Inventory . AllColumns ,
) . FROM (
Inventory ,
) . ORDER_BY (
Inventory . InventoryID . ASC ( ) ,
)
rows , err := stmt . Rows ( context . Background ( ) , db )
require . NoError ( t , err )
for rows . Next ( ) {
var inventory model . Inventory
err = rows . Scan ( & inventory )
require . NoError ( t , err )
require . NotEqual ( t , inventory . InventoryID , int32 ( 0 ) )
require . NotEqual ( t , inventory . FilmID , int16 ( 0 ) )
require . NotEqual ( t , inventory . StoreID , int16 ( 0 ) )
require . NotEqual ( t , inventory . LastUpdate , time . Time { } )
if inventory . InventoryID == 2103 {
require . Equal ( t , inventory . FilmID , int16 ( 456 ) )
require . Equal ( t , inventory . StoreID , int16 ( 2 ) )
require . Equal ( t , inventory . LastUpdate . Format ( time . RFC3339 ) , "2006-02-15T10:09:17Z" )
}
}
err = rows . Close ( )
require . NoError ( t , err )
err = rows . Err ( )
require . NoError ( t , err )
requireLogged ( t , stmt )
2022-01-12 19:03:50 +01:00
requireQueryLogged ( t , stmt , 0 )
2021-05-16 18:46:50 +02:00
}
2022-02-09 12:34:10 +01:00
func TestScanNullColumn ( t * testing . T ) {
stmt := SELECT (
Address . AllColumns ,
) . FROM (
Address ,
) . WHERE (
Address . Address2 . IS_NULL ( ) ,
)
var dest [ ] model . Address
err := stmt . Query ( db , & dest )
require . NoError ( t , err )
testutils . AssertJSON ( t , dest , `
[
{
"AddressID" : 1 ,
"Address" : "47 MySakila Drive" ,
"Address2" : null ,
"District" : "Alberta" ,
"CityID" : 300 ,
"PostalCode" : "" ,
"Phone" : "" ,
"LastUpdate" : "2006-02-15T09:45:30Z"
} ,
{
"AddressID" : 2 ,
"Address" : "28 MySQL Boulevard" ,
"Address2" : null ,
"District" : "QLD" ,
"CityID" : 576 ,
"PostalCode" : "" ,
"Phone" : "" ,
"LastUpdate" : "2006-02-15T09:45:30Z"
} ,
{
"AddressID" : 3 ,
"Address" : "23 Workhaven Lane" ,
"Address2" : null ,
"District" : "Alberta" ,
"CityID" : 300 ,
"PostalCode" : "" ,
"Phone" : "14033335568" ,
"LastUpdate" : "2006-02-15T09:45:30Z"
} ,
{
"AddressID" : 4 ,
"Address" : "1411 Lillydale Drive" ,
"Address2" : null ,
"District" : "QLD" ,
"CityID" : 576 ,
"PostalCode" : "" ,
"Phone" : "6172235589" ,
"LastUpdate" : "2006-02-15T09:45:30Z"
}
]
` )
}
func TestRowsScanSetZeroValue ( t * testing . T ) {
stmt := SELECT (
Rental . AllColumns ,
) . FROM (
Rental ,
) . WHERE (
Rental . RentalID . IN ( Int ( 16049 ) , Int ( 15966 ) ) ,
) . ORDER_BY (
Rental . RentalID . DESC ( ) ,
)
rows , err := stmt . Rows ( context . Background ( ) , db )
require . NoError ( t , err )
defer rows . Close ( )
// destination object is used as destination for all rows scan.
// this tests checks that ReturnedDate is set to nil with the second call
// check qrm.setZeroValue
var dest model . Rental
for rows . Next ( ) {
err := rows . Scan ( & dest )
require . NoError ( t , err )
if dest . RentalID == 16049 {
testutils . AssertJSON ( t , dest , `
{
"RentalID" : 16049 ,
"RentalDate" : "2005-08-23T22:50:12Z" ,
"InventoryID" : 2666 ,
"CustomerID" : 393 ,
"ReturnDate" : "2005-08-30T01:01:12Z" ,
"StaffID" : 2 ,
"LastUpdate" : "2006-02-16T02:30:53Z"
}
` )
} else {
testutils . AssertJSON ( t , dest , `
{
"RentalID" : 15966 ,
"RentalDate" : "2006-02-14T15:16:03Z" ,
"InventoryID" : 4472 ,
"CustomerID" : 374 ,
"ReturnDate" : null ,
"StaffID" : 1 ,
"LastUpdate" : "2006-02-16T02:30:53Z"
}
` )
}
}
err = rows . Close ( )
require . NoError ( t , err )
err = rows . Err ( )
require . NoError ( t , err )
}
2021-10-15 17:43:10 +02:00
func TestScanNumericToFloat ( t * testing . T ) {
2021-05-21 16:09:29 +02:00
type Number struct {
Float32 float32
Float64 float64
}
numeric := CAST ( Decimal ( "1234567890.111" ) ) . AS_NUMERIC ( )
stmt := SELECT (
numeric . AS ( "number.float32" ) ,
numeric . AS ( "number.float64" ) ,
)
var number Number
err := stmt . Query ( db , & number )
require . NoError ( t , err )
require . Equal ( t , number . Float32 , float32 ( 1.234568e+09 ) )
require . Equal ( t , number . Float64 , float64 ( 1.234567890111e+09 ) )
}
2021-10-15 17:43:10 +02:00
func TestScanNumericToIntegerError ( t * testing . T ) {
var dest struct {
Integer int32
}
err := SELECT (
CAST ( Decimal ( "1234567890.111" ) ) . AS_NUMERIC ( ) . AS ( "integer" ) ,
) . Query ( db , & dest )
require . Error ( t , err )
if isPgxDriver ( ) {
require . Contains ( t , err . Error ( ) , ` jet: can't assign string("1234567890.111") to 'Integer int32': converting driver.Value type string ("1234567890.111") to a int64: invalid syntax ` )
} else {
require . Contains ( t , err . Error ( ) , ` jet: can't assign []uint8("1234567890.111") to 'Integer int32': converting driver.Value type []uint8 ("1234567890.111") to a int64: invalid syntax ` )
}
}
2022-02-09 12:34:10 +01:00
func TestScanIntoCustomBaseTypes ( t * testing . T ) {
type MyUint8 uint8
type MyUint16 uint16
type MyUint32 uint32
type MyInt16 int16
type MyFloat32 float32
type MyFloat64 float64
type MyString string
type MyTime = time . Time
type film struct {
FilmID MyUint16 ` sql:"primary_key" `
Title MyString
Description * MyString
ReleaseYear * MyInt16
LanguageID MyUint8
RentalDuration MyUint8
RentalRate MyFloat32
Length * MyUint32
ReplacementCost MyFloat64
Rating * model . MpaaRating
LastUpdate MyTime
SpecialFeatures * MyString
Fulltext MyString
}
stmt := SELECT (
Film . AllColumns ,
) . FROM (
Film ,
) . ORDER_BY (
Film . FilmID . ASC ( ) ,
) . LIMIT ( 3 )
var films [ ] model . Film
err := stmt . Query ( db , & films )
require . NoError ( t , err )
var myFilms [ ] film
err = stmt . Query ( db , & myFilms )
require . NoError ( t , err )
require . Equal ( t , testutils . ToJSON ( films ) , testutils . ToJSON ( myFilms ) )
}
2021-10-04 10:48:07 +02:00
// QueryContext panic when the scanned value is nil and the destination is a slice of primitive
// https://github.com/go-jet/jet/issues/91
func TestScanToPrimitiveElementsSlice ( t * testing . T ) {
tx , err := db . Begin ( )
require . NoError ( t , err )
defer tx . Rollback ( )
// add actor without associated film (so that destination Title array is NULL).
_ , err = Actor . INSERT ( ) .
MODEL (
model . Actor {
ActorID : 201 ,
FirstName : "Brigitte" ,
LastName : "Bardot" ,
LastUpdate : time . Time { } ,
} ,
) . Exec ( tx )
require . NoError ( t , err )
stmt := SELECT (
Actor . ActorID . AS ( "actor_id" ) ,
Film . Title . AS ( "title" ) ,
) . FROM (
Actor .
LEFT_JOIN ( FilmActor , Actor . ActorID . EQ ( FilmActor . ActorID ) ) .
LEFT_JOIN ( Film , Film . FilmID . EQ ( FilmActor . FilmID ) ) ,
) . WHERE (
Actor . ActorID . GT ( Int ( 199 ) ) ,
) . ORDER_BY ( Actor . ActorID . DESC ( ) )
var dest [ ] struct {
ActorID int ` sql:"primary_key" `
Title [ ] string
}
err = stmt . Query ( tx , & dest )
require . NoError ( t , err )
require . Equal ( t , dest [ 0 ] . ActorID , 201 )
require . Equal ( t , dest [ 0 ] . Title , [ ] string ( nil ) )
require . Equal ( t , dest [ 1 ] . ActorID , 200 )
require . Len ( t , dest [ 1 ] . Title , 20 )
}
2022-05-14 11:17:39 +02:00
// https://github.com/go-jet/jet/issues/127
func TestValuerTypeDebugSQL ( t * testing . T ) {
type customer struct {
CustomerID null . Int32 ` sql:"primary_key" `
StoreID null . Int16
FirstName null . String
LastName string
Email null . String
AddressID int16
Activebool null . Bool
CreateDate null . Time
LastUpdate null . Time
Active null . Int8
}
stmt := Customer . INSERT ( ) .
MODEL (
customer {
CustomerID : null . Int32From ( 1234 ) ,
StoreID : null . Int16From ( 0 ) ,
FirstName : null . StringFrom ( "Joe" ) ,
LastName : "" ,
Email : null . StringFromPtr ( nil ) ,
AddressID : 1 ,
Activebool : null . BoolFrom ( true ) ,
CreateDate : null . TimeFrom ( time . Date ( 2020 , 2 , 2 , 10 , 0 , 0 , 0 , time . UTC ) ) ,
LastUpdate : null . TimeFromPtr ( nil ) ,
Active : null . Int8From ( 1 ) ,
} ,
)
testutils . AssertDebugStatementSql ( t , stmt , `
INSERT INTO dvds . customer
VALUES ( 1234 , 0 , ' Joe ' , ' ' , NULL , 1 , TRUE , ' 2020 - 02 - 02 10 : 00 : 00 Z ' , NULL , 1 ) ;
` )
testutils . AssertExecAndRollback ( t , stmt , db )
}
2019-05-20 17:37:55 +02:00
var address256 = model . Address {
AddressID : 256 ,
Address : "1497 Yuzhou Drive" ,
2024-10-05 12:32:03 -04:00
Address2 : testutils . PtrOf ( "" ) ,
2019-05-20 17:37:55 +02:00
District : "England" ,
CityID : 312 ,
2024-10-05 12:32:03 -04:00
PostalCode : testutils . PtrOf ( "3433" ) ,
2019-05-20 17:37:55 +02:00
Phone : "246810237916" ,
2019-07-29 18:08:53 +02:00
LastUpdate : * testutils . TimestampWithoutTimeZone ( "2006-02-15 09:45:30" , 0 ) ,
2019-05-20 17:37:55 +02:00
}
var addres517 = model . Address {
AddressID : 517 ,
Address : "548 Uruapan Street" ,
2024-10-05 12:32:03 -04:00
Address2 : testutils . PtrOf ( "" ) ,
2019-05-20 17:37:55 +02:00
District : "Ontario" ,
CityID : 312 ,
2024-10-05 12:32:03 -04:00
PostalCode : testutils . PtrOf ( "35653" ) ,
2019-05-20 17:37:55 +02:00
Phone : "879347453467" ,
2019-07-29 18:08:53 +02:00
LastUpdate : * testutils . TimestampWithoutTimeZone ( "2006-02-15 09:45:30" , 0 ) ,
2019-05-20 17:37:55 +02:00
}
var customer256 = model . Customer {
CustomerID : 252 ,
StoreID : 2 ,
FirstName : "Mattie" ,
LastName : "Hoffman" ,
2024-10-05 12:32:03 -04:00
Email : testutils . PtrOf ( "mattie.hoffman@sakilacustomer.org" ) ,
2019-05-20 17:37:55 +02:00
AddressID : 256 ,
Activebool : true ,
2019-07-29 18:08:53 +02:00
CreateDate : * testutils . TimestampWithoutTimeZone ( "2006-02-14 00:00:00" , 0 ) ,
LastUpdate : testutils . TimestampWithoutTimeZone ( "2013-05-26 14:49:45.738" , 0 ) ,
2024-10-05 12:32:03 -04:00
Active : testutils . PtrOf ( int32 ( 1 ) ) ,
2019-05-20 17:37:55 +02:00
}
var customer512 = model . Customer {
CustomerID : 512 ,
StoreID : 1 ,
FirstName : "Cecil" ,
LastName : "Vines" ,
2024-10-05 12:32:03 -04:00
Email : testutils . PtrOf ( "cecil.vines@sakilacustomer.org" ) ,
2019-05-20 17:37:55 +02:00
AddressID : 517 ,
Activebool : true ,
2019-07-29 18:08:53 +02:00
CreateDate : * testutils . TimestampWithoutTimeZone ( "2006-02-14 00:00:00" , 0 ) ,
LastUpdate : testutils . TimestampWithoutTimeZone ( "2013-05-26 14:49:45.738" , 0 ) ,
2024-10-05 12:32:03 -04:00
Active : testutils . PtrOf ( int32 ( 1 ) ) ,
2019-05-20 17:37:55 +02:00
}
var countryUk = model . Country {
CountryID : 102 ,
Country : "United Kingdom" ,
2019-07-29 18:08:53 +02:00
LastUpdate : * testutils . TimestampWithoutTimeZone ( "2006-02-15 09:44:00" , 0 ) ,
2019-05-20 17:37:55 +02:00
}
var cityLondon = model . City {
CityID : 312 ,
City : "London" ,
CountryID : 102 ,
2019-07-29 18:08:53 +02:00
LastUpdate : * testutils . TimestampWithoutTimeZone ( "2006-02-15 09:45:25" , 0 ) ,
2019-05-20 17:37:55 +02:00
}
var inventory1 = model . Inventory {
InventoryID : 1 ,
FilmID : 1 ,
StoreID : 1 ,
2019-07-29 18:08:53 +02:00
LastUpdate : * testutils . TimestampWithoutTimeZone ( "2006-02-15 10:09:17" , 0 ) ,
2019-05-20 17:37:55 +02:00
}
var inventory2 = model . Inventory {
InventoryID : 2 ,
FilmID : 1 ,
StoreID : 1 ,
2019-07-29 18:08:53 +02:00
LastUpdate : * testutils . TimestampWithoutTimeZone ( "2006-02-15 10:09:17" , 0 ) ,
2019-05-20 17:37:55 +02:00
}
var film1 = model . Film {
FilmID : 1 ,
Title : "Academy Dinosaur" ,
2024-10-05 12:32:03 -04:00
Description : testutils . PtrOf ( "A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies" ) ,
ReleaseYear : testutils . PtrOf ( int32 ( 2006 ) ) ,
2019-05-20 17:37:55 +02:00
LanguageID : 1 ,
RentalDuration : 6 ,
RentalRate : 0.99 ,
2024-10-05 12:32:03 -04:00
Length : testutils . PtrOf ( int16 ( 86 ) ) ,
2019-05-20 17:37:55 +02:00
ReplacementCost : 20.99 ,
Rating : & pgRating ,
2019-07-29 18:08:53 +02:00
LastUpdate : * testutils . TimestampWithoutTimeZone ( "2013-05-26 14:50:58.951" , 3 ) ,
2024-10-05 12:32:03 -04:00
SpecialFeatures : testutils . PtrOf ( "{\"Deleted Scenes\",\"Behind the Scenes\"}" ) ,
2019-05-20 17:37:55 +02:00
Fulltext : "'academi':1 'battl':15 'canadian':20 'dinosaur':2 'drama':5 'epic':4 'feminist':8 'mad':11 'must':14 'rocki':21 'scientist':12 'teacher':17" ,
}
2019-05-21 13:11:45 +02:00
var film2 = model . Film {
FilmID : 2 ,
Title : "Ace Goldfinger" ,
2024-10-05 12:32:03 -04:00
Description : testutils . PtrOf ( "A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China" ) ,
ReleaseYear : testutils . PtrOf ( int32 ( 2006 ) ) ,
2019-05-21 13:11:45 +02:00
LanguageID : 1 ,
RentalDuration : 3 ,
RentalRate : 4.99 ,
2024-10-05 12:32:03 -04:00
Length : testutils . PtrOf ( int16 ( 48 ) ) ,
2019-05-21 13:11:45 +02:00
ReplacementCost : 12.99 ,
Rating : & gRating ,
2019-07-29 18:08:53 +02:00
LastUpdate : * testutils . TimestampWithoutTimeZone ( "2013-05-26 14:50:58.951" , 3 ) ,
2024-10-05 12:32:03 -04:00
SpecialFeatures : testutils . PtrOf ( ` { Trailers,"Deleted Scenes"} ` ) ,
2019-05-21 13:11:45 +02:00
Fulltext : ` 'ace':1 'administr':9 'ancient':19 'astound':4 'car':17 'china':20 'databas':8 'epistl':5 'explor':12 'find':15 'goldfing':2 'must':14 ` ,
}
2019-05-20 17:37:55 +02:00
var store1 = model . Store {
StoreID : 1 ,
ManagerStaffID : 1 ,
AddressID : 1 ,
2019-07-29 18:08:53 +02:00
LastUpdate : * testutils . TimestampWithoutTimeZone ( "2006-02-15 09:57:12" , 0 ) ,
2019-05-20 17:37:55 +02:00
}
2019-07-03 16:27:14 +02:00
var pgRating = model . MpaaRating_Pg
2019-05-21 13:11:45 +02:00
var gRating = model . MpaaRating_G
2019-05-20 17:37:55 +02:00
var language1 = model . Language {
LanguageID : 1 ,
Name : "English " ,
2019-07-29 18:08:53 +02:00
LastUpdate : * testutils . TimestampWithoutTimeZone ( "2006-02-15 10:02:19" , 0 ) ,
2019-05-20 17:37:55 +02:00
}