/*
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

'use strict'

var UsergridQuery = require('../../lib/query')

describe('_type', function() {
    it('_type should equal "cats" when passing "type" as a parameter to UsergridQuery', function() {
        var query = new UsergridQuery('cats')
        query.should.have.property('_type').equal('cats')
    })

    it('_type should equal "cats" when calling .type() builder method', function() {
        var query = new UsergridQuery().type('cats')
        query.should.have.property('_type').equal('cats')
    })

    it('_type should equal "cats" when calling .collection() builder method', function() {
        var query = new UsergridQuery().collection('cats')
        query.should.have.property('_type').equal('cats')
    })
})

describe('_limit', function() {
    it('_limit should equal 2 when setting .limit(2)', function() {
        var query = new UsergridQuery('cats').limit(2)
        query.should.have.property('_limit').equal(2)
    })

    it('_limit should equal 10 when setting .limit(10)', function() {
        var query = new UsergridQuery('cats').limit(10)
        query.should.have.property('_limit').equal(10)
    })
})

describe('_ql', function() {
    it('should equal \'select *\' if query or sort are empty or underfined', function() {
        var query = new UsergridQuery('cats')
        query.should.have.property('_ql').equal('select *')
    })

    it('should support complex builder pattern syntax (chained constructor methods)', function() {
        var query = new UsergridQuery('cats')
            .gt('weight', 2.4)
            .contains('color', 'bl*')
            .not
            .eq('color', 'blue')
            .or
            .eq('color', 'orange')
        query.should.have.property('_ql').equal("select * where weight > 2.4 and color contains 'bl*' and not color = 'blue' or color = 'orange'")
    })

    it('and operator should be implied when joining multiple conditions', function() {
        var query1 = new UsergridQuery('cats')
            .gt('weight', 2.4)
            .contains('color', 'bl*')
        query1.should.have.property('_ql').equal("select * where weight > 2.4 and color contains 'bl*'")
        var query2 = new UsergridQuery('cats')
            .gt('weight', 2.4)
            .and
            .contains('color', 'bl*')
        query2.should.have.property('_ql').equal("select * where weight > 2.4 and color contains 'bl*'")
    })

    it('not operator should precede conditional statement', function() {
        var query = new UsergridQuery('cats')
            .not
            .eq('color', 'white')
        query.should.have.property('_ql').equal("select * where not color = 'white'")
    })

    it('fromString should set _ql directly, bypassing builder pattern methods', function() {
        var q = "where color = 'black' or color = 'orange'"
        var query = new UsergridQuery('cats')
            .fromString(q)
        query.should.have.property('_ql').equal(q)
    })

    it('string values should be contained in single quotes', function() {
        var query = new UsergridQuery('cats')
            .eq('color', 'black')
        query.should.have.property('_ql').equal("select * where color = 'black'")
    })

    it('boolean values should not be contained in single quotes', function() {
        var query = new UsergridQuery('cats')
            .eq('longHair', true)
        query.should.have.property('_ql').equal("select * where longHair = true")
    })

    it('float values should not be contained in single quotes', function() {
        var query = new UsergridQuery('cats')
            .lt('weight', 18)
        query.should.have.property('_ql').equal("select * where weight < 18")
    })

    it('integer values should not be contained in single quotes', function() {
        var query = new UsergridQuery('cats')
            .gte('weight', 2)
        query.should.have.property('_ql').equal("select * where weight >= 2")
    })

    it('uuid values should not be contained in single quotes', function() {
        var query = new UsergridQuery('cats')
            .eq('uuid', 'a61e29ba-944f-11e5-8690-fbb14f62c803')
        query.should.have.property('_ql').equal("select * where uuid = a61e29ba-944f-11e5-8690-fbb14f62c803")
    })
})