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  }