Skip to content

Commit

Permalink
sqlgen: added errors checking for Update
Browse files Browse the repository at this point in the history
  • Loading branch information
fsouza committed Mar 28, 2012
1 parent beec439 commit e3a0ef7
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 11 deletions.
22 changes: 16 additions & 6 deletions sqlgen/sqlgen.go
Expand Up @@ -76,15 +76,25 @@ func Delete(obj interface{}, filters []string) string {
// uFields are the fields that are gonna be update
// fFields are the fields that are gonna be used as filter
// to the where clause
func Update(obj interface{}, uFields, fFields []string) string {
t := reflect.TypeOf(obj).Elem()
func Update(obj interface{}, updateFields, filterFields []string) (string, error) {
t, err := checkType(obj)
if err != nil {
return "", err
}
err = checkPresenceOfFields(t, updateFields)
if err != nil {
return "", err
}
err = checkPresenceOfFields(t, filterFields)
if err != nil {
return "", err
}

fieldsAndValues := preparedFields(uFields)
filters := preparedFields(fFields)
fieldsAndValues := preparedFields(updateFields)
filters := preparedFields(filterFields)

sql := fmt.Sprintf("update %s set %s where %s", strings.ToLower(t.Name()), strings.Join(fieldsAndValues, ", "), strings.Join(filters, " and "))

return sql
return sql, nil
}

func checkPresenceOfFields(t reflect.Type, fields []string) error {
Expand Down
49 changes: 44 additions & 5 deletions sqlgen/sqlgen_test.go
Expand Up @@ -132,26 +132,65 @@ func TestMultipleFilterDeleteFromStruct(t *testing.T) {
}
}

func TestUpdateFromStruct(t *testing.T) {
func TestUpdateFromStructPointer(t *testing.T) {
p := Person{Id: 1, Name: "Umi", Age: 6}
expected := "update person set name=?, age=? where id=?"
got := Update(&p, []string{"name", "age"}, []string{"id"})
got, _ := Update(&p, []string{"name", "age"}, []string{"id"})

if expected != got {
t.Errorf(`UPDATE generation for %q: Was expecting "%s", got %s.`, reflect.TypeOf(p), expected, got)
}
}

func TestMultipleFilterUpdateFromStructure(t *testing.T) {
func TestUpdateFromStructValue(t *testing.T) {
p := Person{Id: 1, Name: "Umi", Age: 6}
expected := "update person set name=?, age=? where id=?"
got, _ := Update(p, []string{"name", "age"}, []string{"id"})

if expected != got {
t.Errorf(`UPDATE generation for %q: Was expecting "%s", got %s.`, reflect.TypeOf(p), expected, got)
}
}

func TestMultipleFilterUpdateFromStruct(t *testing.T) {
p := Person{Id: 1, Name: "Umi", Age: 6}
expected := "update person set age=? where id=? and name=?"
got := Update(&p, []string{"age"}, []string{"id", "name"})
got, _ := Update(&p, []string{"age"}, []string{"id", "name"})

if expected != got {
t.Errorf(`UPDATE generation for %q: Was expecting "%s", got %s.`, reflect.TypeOf(p), expected, got)
}
}

func TestUpdateReturnErrorIfTheGivenObjectIsNotAStruct(t *testing.T) {
i := 10
_, err := Update(i, []string{"name", "age"}, []string{"id"})

if err == nil || !strings.Contains(err.Error(), "provide a struct") {
t.Errorf("UPDATE generation: should return an error when obj is not a struct")
}
}

func TestUpdateReturnErrorIfOneOfTheUpdateFieldsIsNotMemberOfObj(t *testing.T) {
p := Person{Id: 1, Name: "Umi", Age: 6}
p.Age++
_, err := Update(p, []string{"age", "weight"}, []string{"id"})

if err == nil || !strings.Contains(err.Error(), `Person does not have a field called "weight"`) {
t.Errorf("UPDATE generation: should return an error when one or more of the update fields is not member of the given struct")
}
}

func TestUpdateReturnErrorIfOneOfTheFilterFieldsIsNotMemberOfObj(t *testing.T) {
p := Person{Id: 1, Name: "Umi", Age: 6}
p.Age++
_, err := Update(p, []string{"age"}, []string{"weight"})

if err == nil || !strings.Contains(err.Error(), `Person does not have a field called "weight"`) {
t.Errorf("UPDATE generation: should return an error when one or more of the filter fields is not member of the given struct, %s")
}
}

func TestCheckTypeReturnsTheTypeForStructPointer(t *testing.T) {
var p = new(Person)
tp, _ := checkType(p)
Expand Down Expand Up @@ -187,7 +226,7 @@ func TestCheckFieldPresenceReturnsNilIfAllFieldsAreMemberOfTheStruct(t *testing.
}
}

func TestCheckFieldPresenceReturnsAnErrorIfAtLeastOneOfTheFieldsIsNotAMemberOfTheStruct(t *testing.T) {
func TestCheckFieldPresenceReturnsAnErrorIfAtLeastOneOfTheFieldsIsNotMemberOfTheStruct(t *testing.T) {
var p Person
err := checkPresenceOfFields(reflect.TypeOf(p), []string{"age", "school"})
if err == nil || !strings.Contains(err.Error(), `Person does not have a field called "school"`) {
Expand Down

0 comments on commit e3a0ef7

Please sign in to comment.