diff --git a/tests/postgres/alltypes_test.go b/tests/postgres/alltypes_test.go index 46262ff..f8d2059 100644 --- a/tests/postgres/alltypes_test.go +++ b/tests/postgres/alltypes_test.go @@ -24,13 +24,11 @@ import ( "github.com/go-jet/jet/v2/tests/testdata/results/common" ) -var AllTypesAllColumns = AllTypes.AllColumns. - Except(IntegerColumn("rowid")) // cockroachDB: exclude rowid column - func TestAllTypesSelect(t *testing.T) { var dest []model.AllTypes - err := AllTypes.SELECT(AllTypesAllColumns). + err := SELECT(AllTypes.AllColumns). + FROM(AllTypes). LIMIT(2). Query(db, &dest) @@ -42,7 +40,7 @@ func TestAllTypesSelect(t *testing.T) { func TestAllTypesSelectJson(t *testing.T) { stmt := SELECT_JSON_ARR( - AllTypesAllColumns.Except( + AllTypes.AllColumns.Except( AllTypes.JSON, AllTypes.JSONPtr, AllTypes.Jsonb, AllTypes.JsonbPtr, AllTypes.JsonbArray, @@ -203,9 +201,14 @@ func TestMaterializedViewAllTypes(t *testing.T) { func TestAllTypesInsertModel(t *testing.T) { skipForPgxDriver(t) // pgx driver bug ERROR: date/time field value out of range: "0000-01-01 12:05:06Z" (SQLSTATE 22008) - query := AllTypes.INSERT(AllTypesAllColumns). - MODEL(allTypesRow0). - MODEL(&allTypesRow1). + row0 := testutils.DeepCopy(t, allTypesRow0) + row0.Serial = 10 + row1 := testutils.DeepCopy(t, allTypesRow1) + row1.Serial = 11 + + query := AllTypes.INSERT(AllTypes.AllColumns). + MODEL(row0). + MODEL(&row1). RETURNING(AllTypes.AllColumns) testutils.ExecuteInTxAndRollback(t, db, func(tx qrm.DB) { @@ -217,19 +220,19 @@ func TestAllTypesInsertModel(t *testing.T) { return } require.Equal(t, len(dest), 2) - testutils.AssertDeepEqual(t, dest[0], allTypesRow0) - testutils.AssertDeepEqual(t, dest[1], allTypesRow1) + testutils.AssertDeepEqual(t, dest[0], row0) + testutils.AssertDeepEqual(t, dest[1], row1) }) } func TestAllTypesInsertQuery(t *testing.T) { - query := AllTypes.INSERT(AllTypesAllColumns). + query := AllTypes.INSERT(AllTypes.MutableColumns). QUERY( AllTypes. - SELECT(AllTypesAllColumns). + SELECT(AllTypes.MutableColumns). LIMIT(2), ). - RETURNING(AllTypesAllColumns) + RETURNING(AllTypes.AllColumns) testutils.ExecuteInTxAndRollback(t, db, func(tx qrm.DB) { var dest []model.AllTypes @@ -237,6 +240,8 @@ func TestAllTypesInsertQuery(t *testing.T) { require.NoError(t, err) require.Equal(t, len(dest), 2) + dest[0].Serial = allTypesRow0.Serial + dest[1].Serial = allTypesRow1.Serial testutils.AssertDeepEqual(t, dest[0], allTypesRow0) testutils.AssertDeepEqual(t, dest[1], allTypesRow1) }) @@ -319,7 +324,7 @@ WHERE all_types.bytea_ptr = $1::bytea; } func TestAllTypesFromSubQuery(t *testing.T) { - subQuery := SELECT(AllTypesAllColumns). + subQuery := SELECT(AllTypes.AllColumns). FROM(AllTypes). AsTable("allTypesSubQuery") diff --git a/tests/postgres/generator_test.go b/tests/postgres/generator_test.go index 46626a5..2769c73 100644 --- a/tests/postgres/generator_test.go +++ b/tests/postgres/generator_test.go @@ -9,6 +9,7 @@ import ( "reflect" "regexp" "strconv" + "strings" "testing" "github.com/stretchr/testify/require" @@ -752,8 +753,6 @@ func UseSchema(schema string) { ` func TestGeneratedAllTypesSQLBuilderFiles(t *testing.T) { - skipForCockroachDB(t) // because of rowid column - enumDir := filepath.Join(testRoot, "/.gentestdata/jetdb/test_sample/enum/") modelDir := filepath.Join(testRoot, "/.gentestdata/jetdb/test_sample/model/") tableDir := filepath.Join(testRoot, "/.gentestdata/jetdb/test_sample/table/") @@ -761,19 +760,56 @@ func TestGeneratedAllTypesSQLBuilderFiles(t *testing.T) { testutils.AssertFileNamesEqual(t, enumDir, "mood.go", "level.go") testutils.AssertFileContent(t, enumDir+"/mood.go", moodEnumContent) - testutils.AssertFileContent(t, enumDir+"/level.go", levelEnumContent) - testutils.AssertFileNamesEqual(t, modelDir, "all_types.go", "all_types_view.go", "employee.go", "link.go", + if sourceIsPostgres() { + testutils.AssertFileContent(t, enumDir+"/level.go", levelEnumContent) + } + + var cockroachModels = []string{"all_types.go", "all_types_view.go", "employee.go", "link.go", "mood.go", "person.go", "person_phone.go", "weird_names_table.go", "level.go", "user.go", "floats.go", "people.go", - "components.go", "vulnerabilities.go", "all_types_materialized_view.go", "sample_ranges.go", "sample_arrays.go") - testutils.AssertFileContent(t, modelDir+"/all_types.go", allTypesModelContent) + "components.go", "vulnerabilities.go", "all_types_materialized_view.go", "sample_arrays.go"} + + var postgresModels = append(cockroachModels, "sample_ranges.go") + + if sourceIsCockroachDB() { + testutils.AssertFileNamesEqual(t, modelDir, cockroachModels...) + } else { + testutils.AssertFileNamesEqual(t, modelDir, postgresModels...) + } + + if sourceIsCockroachDB() { + enumFileData, err := os.ReadFile(modelDir + "/all_types.go") // #nosec G304 + + require.NoError(t, err) + + r := strings.NewReplacer( + "Smallserial int64", "Smallserial int16", + "Serial int64", "Serial int32", + ) + + require.Equal(t, "\n"+r.Replace(string(enumFileData)), allTypesModelContent) + } else { + testutils.AssertFileContent(t, modelDir+"/all_types.go", allTypesModelContent) + } + testutils.AssertFileContent(t, modelDir+"/link.go", linkModelContent) - testutils.AssertFileNamesEqual(t, tableDir, "all_types.go", "employee.go", "link.go", + var cdbSqlBuilders = []string{"all_types.go", "employee.go", "link.go", "person.go", "person_phone.go", "weird_names_table.go", "user.go", "floats.go", "people.go", "table_use_schema.go", - "components.go", "vulnerabilities.go", "sample_ranges.go", "sample_arrays.go") + "components.go", "vulnerabilities.go", "sample_arrays.go"} + var postgresSqlBuilders = append(cdbSqlBuilders, "sample_ranges.go") + + if sourceIsCockroachDB() { + testutils.AssertFileNamesEqual(t, tableDir, cdbSqlBuilders...) + } else { + testutils.AssertFileNamesEqual(t, tableDir, postgresSqlBuilders...) + } + testutils.AssertFileContent(t, tableDir+"/all_types.go", allTypesTableContent) - testutils.AssertFileContent(t, tableDir+"/sample_ranges.go", sampleRangeTableContent) + + if sourceIsPostgres() { + testutils.AssertFileContent(t, tableDir+"/sample_ranges.go", sampleRangeTableContent) + } testutils.AssertFileContent(t, tableDir+"/link.go", linkTableContent) @@ -864,7 +900,7 @@ type AllTypes struct { DoublePrecisionPtr *float64 DoublePrecision float64 Smallserial int16 - Serial int32 + Serial int32 ` + "`sql:\"primary_key\"`" + ` Bigserial int64 VarCharPtr *string VarChar string @@ -1122,7 +1158,7 @@ func newAllTypesTableImpl(schemaName, tableName, alias string) allTypesTable { MoodPtrColumn = postgres.StringColumn("mood_ptr") MoodColumn = postgres.StringColumn("mood") allColumns = postgres.ColumnList{SmallIntPtrColumn, SmallIntColumn, IntegerPtrColumn, IntegerColumn, BigIntPtrColumn, BigIntColumn, DecimalPtrColumn, DecimalColumn, NumericPtrColumn, NumericColumn, RealPtrColumn, RealColumn, DoublePrecisionPtrColumn, DoublePrecisionColumn, SmallserialColumn, SerialColumn, BigserialColumn, VarCharPtrColumn, VarCharColumn, CharPtrColumn, CharColumn, TextPtrColumn, TextColumn, ByteaPtrColumn, ByteaColumn, TimestampzPtrColumn, TimestampzColumn, TimestampPtrColumn, TimestampColumn, DatePtrColumn, DateColumn, TimezPtrColumn, TimezColumn, TimePtrColumn, TimeColumn, IntervalPtrColumn, IntervalColumn, BooleanPtrColumn, BooleanColumn, PointPtrColumn, BitPtrColumn, BitColumn, BitVaryingPtrColumn, BitVaryingColumn, TsvectorPtrColumn, TsvectorColumn, UUIDPtrColumn, UUIDColumn, XMLPtrColumn, XMLColumn, JSONPtrColumn, JSONColumn, JsonbPtrColumn, JsonbColumn, IntegerArrayPtrColumn, IntegerArrayColumn, TextArrayPtrColumn, TextArrayColumn, JsonbArrayColumn, TextMultiDimArrayPtrColumn, TextMultiDimArrayColumn, MoodPtrColumn, MoodColumn} - mutableColumns = postgres.ColumnList{SmallIntPtrColumn, SmallIntColumn, IntegerPtrColumn, IntegerColumn, BigIntPtrColumn, BigIntColumn, DecimalPtrColumn, DecimalColumn, NumericPtrColumn, NumericColumn, RealPtrColumn, RealColumn, DoublePrecisionPtrColumn, DoublePrecisionColumn, SmallserialColumn, SerialColumn, BigserialColumn, VarCharPtrColumn, VarCharColumn, CharPtrColumn, CharColumn, TextPtrColumn, TextColumn, ByteaPtrColumn, ByteaColumn, TimestampzPtrColumn, TimestampzColumn, TimestampPtrColumn, TimestampColumn, DatePtrColumn, DateColumn, TimezPtrColumn, TimezColumn, TimePtrColumn, TimeColumn, IntervalPtrColumn, IntervalColumn, BooleanPtrColumn, BooleanColumn, PointPtrColumn, BitPtrColumn, BitColumn, BitVaryingPtrColumn, BitVaryingColumn, TsvectorPtrColumn, TsvectorColumn, UUIDPtrColumn, UUIDColumn, XMLPtrColumn, XMLColumn, JSONPtrColumn, JSONColumn, JsonbPtrColumn, JsonbColumn, IntegerArrayPtrColumn, IntegerArrayColumn, TextArrayPtrColumn, TextArrayColumn, JsonbArrayColumn, TextMultiDimArrayPtrColumn, TextMultiDimArrayColumn, MoodPtrColumn, MoodColumn} + mutableColumns = postgres.ColumnList{SmallIntPtrColumn, SmallIntColumn, IntegerPtrColumn, IntegerColumn, BigIntPtrColumn, BigIntColumn, DecimalPtrColumn, DecimalColumn, NumericPtrColumn, NumericColumn, RealPtrColumn, RealColumn, DoublePrecisionPtrColumn, DoublePrecisionColumn, SmallserialColumn, BigserialColumn, VarCharPtrColumn, VarCharColumn, CharPtrColumn, CharColumn, TextPtrColumn, TextColumn, ByteaPtrColumn, ByteaColumn, TimestampzPtrColumn, TimestampzColumn, TimestampPtrColumn, TimestampColumn, DatePtrColumn, DateColumn, TimezPtrColumn, TimezColumn, TimePtrColumn, TimeColumn, IntervalPtrColumn, IntervalColumn, BooleanPtrColumn, BooleanColumn, PointPtrColumn, BitPtrColumn, BitColumn, BitVaryingPtrColumn, BitVaryingColumn, TsvectorPtrColumn, TsvectorColumn, UUIDPtrColumn, UUIDColumn, XMLPtrColumn, XMLColumn, JSONPtrColumn, JSONColumn, JsonbPtrColumn, JsonbColumn, IntegerArrayPtrColumn, IntegerArrayColumn, TextArrayPtrColumn, TextArrayColumn, JsonbArrayColumn, TextMultiDimArrayPtrColumn, TextMultiDimArrayColumn, MoodPtrColumn, MoodColumn} defaultColumns = postgres.ColumnList{SmallIntColumn, IntegerColumn, BigIntColumn, DecimalColumn, NumericColumn, RealColumn, DoublePrecisionColumn, SmallserialColumn, SerialColumn, BigserialColumn, VarCharColumn, CharColumn, TextColumn, ByteaColumn, TimestampzColumn, TimestampColumn, DateColumn, TimezColumn, TimeColumn, IntervalColumn, BooleanColumn, BitColumn, BitVaryingColumn, TsvectorColumn, UUIDColumn, XMLColumn, JSONColumn, JsonbColumn, IntegerArrayColumn, TextArrayColumn, JsonbArrayColumn, TextMultiDimArrayColumn, MoodColumn} ) diff --git a/tests/postgres/main_test.go b/tests/postgres/main_test.go index c3ebecb..0b30c8f 100644 --- a/tests/postgres/main_test.go +++ b/tests/postgres/main_test.go @@ -5,13 +5,14 @@ import ( "database/sql" "encoding/json" "fmt" + "os" + "runtime" + "testing" + "github.com/go-jet/jet/v2/qrm" "github.com/go-jet/jet/v2/stmtcache" "github.com/go-jet/jet/v2/tests/internal/utils/repo" "github.com/jackc/pgx/v4/stdlib" - "os" - "runtime" - "testing" "github.com/go-jet/jet/v2/postgres" "github.com/go-jet/jet/v2/tests/dbconfig" @@ -31,6 +32,7 @@ var source string var withStatementCaching bool const CockroachDB = "COCKROACH_DB" +const Postgres = "POSTGRESQL_DB" func init() { source = os.Getenv("PG_SOURCE") @@ -42,6 +44,10 @@ func sourceIsCockroachDB() bool { return source == CockroachDB } +func sourceIsPostgres() bool { + return source == Postgres +} + func skipForCockroachDB(t *testing.T) { if sourceIsCockroachDB() { t.SkipNow() diff --git a/tests/sqlite/alltypes_test.go b/tests/sqlite/alltypes_test.go index aa6ad08..79210b1 100644 --- a/tests/sqlite/alltypes_test.go +++ b/tests/sqlite/alltypes_test.go @@ -70,7 +70,9 @@ var allTypesJSON = ` "Text": "text", "TextPtr": "text-ptr", "Blob": "YmxvYjE=", - "BlobPtr": "YmxvYi1wdHI=" + "BlobPtr": "YmxvYi1wdHI=", + "JSON": "{\"key1\": \"value1\", \"key2\": \"value2\"}", + "JSONPtr": "{\"key1\": \"value1\", \"key2\": \"value2\"}" }, { "Boolean": false, @@ -110,7 +112,9 @@ var allTypesJSON = ` "Text": "text", "TextPtr": null, "Blob": "YmxvYjI=", - "BlobPtr": null + "BlobPtr": null, + "JSON": "{\"key1\": \"value1\", \"key2\": \"value2\"}", + "JSONPtr": null } ] ` diff --git a/tests/testdata b/tests/testdata index 0387785..5003c48 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit 0387785d9e9ceacba2247d477181436f27bf2068 +Subproject commit 5003c4883cfcf797a74fe0ed596ad4873908fe3a