Skip to content

Commit d1daffd

Browse files
author
Miguel Molina
committed
Improve coverage of kallax package
1 parent 343a08c commit d1daffd

9 files changed

+244
-37
lines changed

common_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,9 @@ var ModelSchema = NewBaseSchema(
149149
"__model",
150150
f("id"),
151151
ForeignKeys{
152-
"rel": NewForeignKey("model_id", false),
153-
"rels": NewForeignKey("model_id", false),
152+
"rel": NewForeignKey("model_id", false),
153+
"rels": NewForeignKey("model_id", false),
154+
"rel_inv": NewForeignKey("model_id", true),
154155
},
155156
func() Record {
156157
return new(model)

events.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,15 @@ func ApplyBeforeEvents(r Record) error {
6666
}
6767

6868
if rec, ok := r.(BeforeInserter); ok && !r.IsPersisted() {
69-
return rec.BeforeInsert()
69+
if err := rec.BeforeInsert(); err != nil {
70+
return err
71+
}
7072
}
7173

7274
if rec, ok := r.(BeforeUpdater); ok && r.IsPersisted() {
73-
return rec.BeforeUpdate()
75+
if err := rec.BeforeUpdate(); err != nil {
76+
return err
77+
}
7478
}
7579

7680
return nil
@@ -92,7 +96,9 @@ func ApplyAfterEvents(r Record, wasPersisted bool) error {
9296
}
9397

9498
if rec, ok := r.(AfterSaver); ok {
95-
return rec.AfterSave()
99+
if err := rec.AfterSave(); err != nil {
100+
return err
101+
}
96102
}
97103

98104
return nil

events_test.go

+52-5
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,17 @@ type (
1515
before struct {
1616
model
1717
evented
18+
errorBeforeSave bool
19+
errorBeforeInsert bool
20+
errorBeforeUpdate bool
1821
}
1922

2023
after struct {
2124
model
2225
evented
26+
errorAfterSave bool
27+
errorAfterInsert bool
28+
errorAfterUpdate bool
2329
}
2430
)
2531

@@ -32,37 +38,55 @@ func (e *evented) setup() {
3238
func (b *before) BeforeInsert() error {
3339
b.setup()
3440
b.events["BeforeInsert"]++
41+
if b.errorBeforeInsert {
42+
return errors.New("foo")
43+
}
3544
return nil
3645
}
3746

3847
func (b *before) BeforeUpdate() error {
3948
b.setup()
4049
b.events["BeforeUpdate"]++
41-
return errors.New("foo")
50+
if b.errorBeforeUpdate {
51+
return errors.New("foo")
52+
}
53+
return nil
4254
}
4355

4456
func (b *before) BeforeSave() error {
4557
b.setup()
4658
b.events["BeforeSave"]++
59+
if b.errorBeforeSave {
60+
return errors.New("foo")
61+
}
4762
return nil
4863
}
4964

5065
func (b *after) AfterInsert() error {
5166
b.setup()
5267
b.events["AfterInsert"]++
68+
if b.errorAfterInsert {
69+
return errors.New("foo")
70+
}
5371
return nil
5472
}
5573

5674
func (b *after) AfterUpdate() error {
5775
b.setup()
5876
b.events["AfterUpdate"]++
77+
if b.errorAfterUpdate {
78+
return errors.New("foo")
79+
}
5980
return nil
6081
}
6182

6283
func (b *after) AfterSave() error {
6384
b.setup()
6485
b.events["AfterSave"]++
65-
return errors.New("foo")
86+
if b.errorAfterSave {
87+
return errors.New("foo")
88+
}
89+
return nil
6690
}
6791

6892
func TestApplyBeforeEvents(t *testing.T) {
@@ -71,21 +95,44 @@ func TestApplyBeforeEvents(t *testing.T) {
7195
var before before
7296
r.Nil(ApplyBeforeEvents(&before))
7397
before.setPersisted()
74-
r.NotNil(ApplyBeforeEvents(&before))
98+
r.Nil(ApplyBeforeEvents(&before))
7599

76100
r.Equal(1, before.events["BeforeInsert"])
77101
r.Equal(1, before.events["BeforeUpdate"])
78102
r.Equal(2, before.events["BeforeSave"])
103+
104+
before.errorBeforeUpdate = true
105+
r.NotNil(ApplyBeforeEvents(&before))
106+
107+
before.errorBeforeInsert = true
108+
before.errorBeforeUpdate = false
109+
before.persisted = false
110+
r.NotNil(ApplyBeforeEvents(&before))
111+
112+
before.errorBeforeSave = true
113+
before.errorBeforeInsert = false
114+
r.NotNil(ApplyBeforeEvents(&before))
79115
}
80116

81117
func TestApplyAfterEvents(t *testing.T) {
82118
r := require.New(t)
83119

84120
var after after
85-
r.NotNil(ApplyAfterEvents(&after, false))
86-
r.NotNil(ApplyAfterEvents(&after, true))
121+
r.Nil(ApplyAfterEvents(&after, false))
122+
r.Nil(ApplyAfterEvents(&after, true))
87123

88124
r.Equal(1, after.events["AfterInsert"])
89125
r.Equal(1, after.events["AfterUpdate"])
90126
r.Equal(2, after.events["AfterSave"])
127+
128+
after.errorAfterUpdate = true
129+
r.NotNil(ApplyAfterEvents(&after, true))
130+
131+
after.errorAfterInsert = true
132+
after.errorAfterUpdate = false
133+
r.NotNil(ApplyAfterEvents(&after, false))
134+
135+
after.errorAfterSave = true
136+
after.errorAfterInsert = false
137+
r.NotNil(ApplyAfterEvents(&after, false))
91138
}

model_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ func TestIDIsEmpty(t *testing.T) {
1515
r.False(id.IsEmpty())
1616
}
1717

18+
func TestID_Value(t *testing.T) {
19+
id := NewID()
20+
v, _ := id.Value()
21+
require.Equal(t, id.String(), v)
22+
}
23+
1824
func TestID_ThreeNewIDsAreDifferent(t *testing.T) {
1925
r := require.New(t)
2026
id1 := NewID()
@@ -32,6 +38,9 @@ func TestID_ThreeNewIDsAreDifferent(t *testing.T) {
3238
func TestVirtualColumn(t *testing.T) {
3339
r := require.New(t)
3440
record := newModel("", "", 0)
41+
record.virtualColumns = nil
42+
r.Equal(nil, record.VirtualColumn("foo"))
43+
3544
record.virtualColumns = nil
3645
s := VirtualColumn("foo", record)
3746

@@ -41,4 +50,6 @@ func TestVirtualColumn(t *testing.T) {
4150
r.NoError(s.Scan(v))
4251
r.Len(record.virtualColumns, 1)
4352
r.Equal(id, record.VirtualColumn("foo"))
53+
54+
r.Error(s.Scan(nil))
4455
}

query.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package kallax
22

33
import (
4+
"errors"
45
"fmt"
56

67
"github.com/Masterminds/squirrel"
78
)
89

10+
var (
11+
// ErrManyToManyNotSupported is returned when a many to many relationship
12+
// is added to a query.
13+
ErrManyToManyNotSupported = errors.New("kallax: many to many relationships are not supported")
14+
)
15+
916
// Query returns information about some query settings and compiles the query.
1017
type Query interface {
1118
compile() ([]string, squirrel.SelectBuilder)
@@ -156,7 +163,7 @@ func (q *BaseQuery) selectedColumns() []SchemaField {
156163
// be passed in the case of one to many relationships.
157164
func (q *BaseQuery) AddRelation(schema Schema, field string, typ RelationshipType, filter Condition) error {
158165
if typ == ManyToMany {
159-
return fmt.Errorf("kallax: many to many relationship are not supported, field: %s", field)
166+
return ErrManyToManyNotSupported
160167
}
161168

162169
fk, ok := q.schema.ForeignKey(field)

query_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,20 @@ func (s *QuerySuite) TestAddRelation() {
8787
s.Equal("SELECT __model.id, __model.name, __model.email, __model.age, __rel_rel.id, __rel_rel.model_id, __rel_rel.foo FROM model __model LEFT JOIN rel __rel_rel ON (__rel_rel.model_id = __model.id)", s.q.String())
8888
}
8989

90+
func (s *QuerySuite) TestAddRelation_Inverse() {
91+
s.Nil(s.q.AddRelation(RelSchema, "rel_inv", OneToOne, nil))
92+
s.Equal("SELECT __model.id, __model.name, __model.email, __model.age, __rel_rel_inv.id, __rel_rel_inv.model_id, __rel_rel_inv.foo FROM model __model LEFT JOIN rel __rel_rel_inv ON (__rel_rel_inv.id = __model.model_id)", s.q.String())
93+
}
94+
95+
func (s *QuerySuite) TestAddRelation_ManyToMany() {
96+
err := s.q.AddRelation(RelSchema, "rel", ManyToMany, nil)
97+
s.Equal(ErrManyToManyNotSupported, err)
98+
}
99+
100+
func (s *QuerySuite) TestAddRelation_FKNotFound() {
101+
s.Error(s.q.AddRelation(RelSchema, "fooo", OneToOne, nil))
102+
}
103+
90104
func (s *QuerySuite) assertSql(sql string) {
91105
_, builder := s.q.compile()
92106
result, _, err := builder.ToSql()

resultset.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package kallax
33
import (
44
"database/sql"
55
"errors"
6-
"fmt"
76
"io"
87

98
"github.com/src-d/go-kallax/types"
@@ -26,6 +25,10 @@ type ResultSet interface {
2625
// not allowed.
2726
var ErrRawScan = errors.New("kallax: result set comes from raw query, use RawScan instead")
2827

28+
// ErrRawScanBatching is an error returned when the `RawScan` method is used
29+
// with a batching result set.
30+
var ErrRawScanBatching = errors.New("kallax: cannot perform a raw scan on a batching result set")
31+
2932
// BaseResultSet is a generic collection of rows.
3033
type BaseResultSet struct {
3134
relationships []Relationship
@@ -167,5 +170,5 @@ func (rs *BatchingResultSet) Close() error {
167170
// RawScan will always throw an error, as this is not a supported operation of
168171
// a batching result set.
169172
func (rs *BatchingResultSet) RawScan(_ ...interface{}) error {
170-
return fmt.Errorf("kallax: cannot perform a raw scan on a batching result set")
173+
return ErrRawScanBatching
171174
}

store.go

+1-10
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,8 @@ func (s *Store) Update(schema Schema, record Record, cols ...SchemaField) (int64
144144
return cnt, nil
145145
}
146146

147-
// Save inserts or updates the given record in the table. It requires a record
148-
// with non empty ID.
147+
// Save inserts or updates the given record in the table.
149148
func (s *Store) Save(schema Schema, record Record) (updated bool, err error) {
150-
if record.GetID().IsEmpty() {
151-
return false, ErrEmptyID
152-
}
153-
154149
if !record.IsPersisted() {
155150
return false, s.Insert(schema, record)
156151
}
@@ -206,10 +201,6 @@ func (s *Store) RawExec(sql string, params ...interface{}) (int64, error) {
206201
// Find performs a query and returns a result set with the results.
207202
func (s *Store) Find(q Query) (ResultSet, error) {
208203
rels := q.getRelationships()
209-
if containsRelationshipOfType(rels, ManyToMany) {
210-
return nil, fmt.Errorf("kallax: many to many relationships are not supported")
211-
}
212-
213204
if containsRelationshipOfType(rels, OneToMany) {
214205
return NewBatchingResultSet(newBatchQueryRunner(q.Schema(), s.proxy, q)), nil
215206
}

0 commit comments

Comments
 (0)