gitlab.com/beacon-software/gadget@v0.0.0-20181217202115-54565ea1ed5e/database/qb/expression_test.go (about) 1 package qb 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 8 "gitlab.com/beacon-software/gadget/generator" 9 ) 10 11 func TestExpresssionFieldToField(t *testing.T) { 12 assert := assert.New(t) 13 expression := FieldComparison(Person.AddressID, Equal, Address.ID) 14 sql, values := expression.SQL() 15 assert.Empty(values) 16 assert.Equal("`person`.`address_id` = `address`.`id`", sql) 17 } 18 19 func TestExpressionFieldToConstant(t *testing.T) { 20 assert := assert.New(t) 21 expression := FieldComparison(Person.AddressID, Equal, SQLNow) 22 sql, values := expression.SQL() 23 assert.Empty(values) 24 assert.Equal("`person`.`address_id` = NOW()", sql) 25 } 26 27 func TestExpresssionFieldComparison(t *testing.T) { 28 assert := assert.New(t) 29 addressID := generator.TestID() 30 expression := FieldComparison(Person.AddressID, Equal, addressID) 31 sql, values := expression.SQL() 32 if assert.Equal(1, len(values)) { 33 assert.Equal(addressID, values[0]) 34 } 35 36 assert.Equal("`person`.`address_id` = ?", sql) 37 } 38 39 func TestExpressionAnd(t *testing.T) { 40 assert := assert.New(t) 41 expression := FieldComparison(Person.AddressID, Equal, Address.ID).And(FieldComparison(Address.Line, IsNot, nil)) 42 actual, values := expression.SQL() 43 assert.Empty(values) 44 assert.Equal("(`person`.`address_id` = `address`.`id` AND `address`.`line` IS NOT NULL)", actual) 45 46 expression2 := FieldComparison(Person.AddressID, Equal, Address.ID).And(FieldComparison(Address.Line, Equal, Person.ID)) 47 actual, values = expression2.SQL() 48 assert.Empty(values) 49 assert.Equal("(`person`.`address_id` = `address`.`id` AND `address`.`line` = `person`.`id`)", actual) 50 51 expression3 := expression.And(expression2) 52 actual, values = expression3.SQL() 53 assert.Empty(values) 54 assert.Equal("((`person`.`address_id` = `address`.`id` AND `address`.`line` IS NOT NULL) AND (`person`.`address_id` = `address`.`id` AND `address`.`line` = `person`.`id`))", actual) 55 } 56 57 func TestExpressionOr(t *testing.T) { 58 assert := assert.New(t) 59 expression := FieldComparison(Person.AddressID, Equal, Address.ID).Or(FieldComparison(Address.Line, IsNot, nil)) 60 actual, values := expression.SQL() 61 assert.Empty(values) 62 assert.Equal("(`person`.`address_id` = `address`.`id` OR `address`.`line` IS NOT NULL)", actual) 63 64 expression2 := FieldComparison(Person.AddressID, Equal, Address.ID).Or(FieldComparison(Address.Line, Equal, Person.ID)) 65 actual, values = expression2.SQL() 66 assert.Empty(values) 67 assert.Equal("(`person`.`address_id` = `address`.`id` OR `address`.`line` = `person`.`id`)", actual) 68 69 expression3 := expression.Or(expression2) 70 actual, values = expression3.SQL() 71 assert.Empty(values) 72 assert.Equal("((`person`.`address_id` = `address`.`id` OR `address`.`line` IS NOT NULL) OR (`person`.`address_id` = `address`.`id` OR `address`.`line` = `person`.`id`))", actual) 73 } 74 75 func TestExpressionXor(t *testing.T) { 76 assert := assert.New(t) 77 expression := FieldComparison(Person.AddressID, Equal, Address.ID).XOr(FieldComparison(Address.Line, IsNot, nil)) 78 actual, values := expression.SQL() 79 assert.Empty(values) 80 assert.Equal("(`person`.`address_id` = `address`.`id` XOR `address`.`line` IS NOT NULL)", actual) 81 82 expression2 := FieldComparison(Person.AddressID, Equal, Address.ID).XOr(FieldComparison(Address.Line, Equal, Person.ID)) 83 actual, values = expression2.SQL() 84 assert.Equal(0, len(values)) 85 assert.Equal("(`person`.`address_id` = `address`.`id` XOR `address`.`line` = `person`.`id`)", actual) 86 87 expression3 := expression.XOr(expression2) 88 actual, values = expression3.SQL() 89 assert.Empty(values) 90 assert.Equal("((`person`.`address_id` = `address`.`id` XOR `address`.`line` IS NOT NULL) XOR (`person`.`address_id` = `address`.`id` XOR `address`.`line` = `person`.`id`))", actual) 91 } 92 93 func TestExpressionMixed(t *testing.T) { 94 assert := assert.New(t) 95 expression := FieldComparison(Person.AddressID, Equal, Address.ID).And(FieldComparison(Address.Line, IsNot, nil)) 96 actual, values := expression.SQL() 97 assert.Empty(values) 98 assert.Equal("(`person`.`address_id` = `address`.`id` AND `address`.`line` IS NOT NULL)", actual) 99 address := generator.String(20) 100 expression2 := FieldComparison(Person.AddressID, Equal, Address.ID).Or(FieldComparison(Address.Line, Equal, address)) 101 actual, values = expression2.SQL() 102 if assert.Equal(1, len(values)) { 103 assert.Equal(address, values[0]) 104 } 105 assert.Equal("(`person`.`address_id` = `address`.`id` OR `address`.`line` = ?)", actual) 106 107 expression3 := expression.XOr(expression2) 108 actual, values = expression3.SQL() 109 if assert.Equal(1, len(values)) { 110 assert.Equal(address, values[0]) 111 } 112 assert.Equal("((`person`.`address_id` = `address`.`id` AND `address`.`line` IS NOT NULL) XOR (`person`.`address_id` = `address`.`id` OR `address`.`line` = ?))", actual) 113 } 114 115 func TestExpressionMulti(t *testing.T) { 116 assert := assert.New(t) 117 expression := FieldIn(Person.AddressID, "*", Address.ID, "foo") 118 actual, values := expression.SQL() 119 if assert.Equal(2, len(values)) { 120 assert.Equal("*", values[0]) 121 assert.Equal("foo", values[1]) 122 } 123 assert.Equal("`person`.`address_id` IN (?, `address`.`id`, ?)", actual) 124 } 125 126 func TestExpressionGetTables(t *testing.T) { 127 assert := assert.New(t) 128 expression := FieldIn(Person.AddressID, "*", Address.ID, "foo") 129 expression.And(FieldComparison(Person.AddressID, Equal, Address.ID)) 130 actual := expression.Tables() 131 sql, _ := expression.SQL() 132 assert.Equal("(`person`.`address_id` IN (?, `address`.`id`, ?) AND `person`.`address_id` = `address`.`id`)", sql) 133 assert.Equal(4, len(actual)) 134 assert.Equal([]string{"person", "address", "person", "address"}, actual) 135 }