diff --git a/json.go b/json.go index b120c2e..69186e9 100644 --- a/json.go +++ b/json.go @@ -25,6 +25,11 @@ func (j *jsonSerializable) Scan(value interface{}) error { return nil } + // Required since sqlite3 returns strings not bytes + if v, ok := value.(string); ok { + value = []byte(v) + } + rawJSON, ok := value.([]byte) if !ok { return fmt.Errorf("unexpected type received to Scan: %T", value) diff --git a/kiss_orm_test.go b/kiss_orm_test.go index 982fbfd..1c1a63d 100644 --- a/kiss_orm_test.go +++ b/kiss_orm_test.go @@ -235,7 +235,7 @@ func TestQueryOne(t *testing.T) { db := connectDB(t, driver) defer db.Close() - _, err := db.Exec(`INSERT INTO users (name, age) VALUES ('Bia', 0)`) + _, err := db.Exec(`INSERT INTO users (name, age, address) VALUES ('Bia', 0, '{"country":"BR"}')`) assert.Equal(t, nil, err) ctx := context.Background() @@ -244,18 +244,44 @@ func TestQueryOne(t *testing.T) { err = c.QueryOne(ctx, &u, `SELECT * FROM users WHERE name=`+c.dialect.Placeholder(0), "Bia") assert.Equal(t, nil, err) - assert.Equal(t, "Bia", u.Name) assert.NotEqual(t, uint(0), u.ID) + assert.Equal(t, "Bia", u.Name) + assert.Equal(t, Address{ + Country: "BR", + }, u.Address) + }) + + t.Run("should return only the first result on multiples matches", func(t *testing.T) { + db := connectDB(t, driver) + defer db.Close() + + _, err := db.Exec(`INSERT INTO users (name, age, address) VALUES ('Andréa Sá', 0, '{"country":"US"}')`) + assert.Equal(t, nil, err) + + _, err = db.Exec(`INSERT INTO users (name, age, address) VALUES ('Caio Sá', 0, '{"country":"BR"}')`) + assert.Equal(t, nil, err) + + ctx := context.Background() + c := newTestDB(db, driver, "users") + + var u User + err = c.QueryOne(ctx, &u, `SELECT * FROM users WHERE name like `+c.dialect.Placeholder(0)+` ORDER BY id ASC`, "% Sá") + assert.Equal(t, nil, err) + assert.Equal(t, "Andréa Sá", u.Name) + assert.Equal(t, 0, u.Age) + assert.Equal(t, Address{ + Country: "US", + }, u.Address) }) t.Run("should report error if input is not a pointer to struct", func(t *testing.T) { db := connectDB(t, driver) defer db.Close() - _, err := db.Exec(`INSERT INTO users (name, age) VALUES ('Andréa Sá', 0)`) + _, err := db.Exec(`INSERT INTO users (name, age, address) VALUES ('Andréa Sá', 0, '{"country":"US"}')`) assert.Equal(t, nil, err) - _, err = db.Exec(`INSERT INTO users (name, age) VALUES ('Caio Sá', 0)`) + _, err = db.Exec(`INSERT INTO users (name, age, address) VALUES ('Caio Sá', 0, '{"country":"BR"}')`) assert.Equal(t, nil, err) ctx := context.Background()