require('../../support/test_helper');

var assert = require('../../support/assert');
var TestClient = require('../../support/test-client');

describe('histogram-dataview', function() {

    afterEach(function(done) {
        if (this.testClient) {
            this.testClient.drain(done);
        } else {
            done();
        }
    });

    var ERROR_RESPONSE = {
        status: 400,
        headers: {
            'Content-Type': 'application/json; charset=utf-8'
        }
    };

    function createMapConfig(dataviews) {
        return {
            version: '1.5.0',
            layers: [
                {
                    "type": "cartodb",
                    "options": {
                        "source": {
                            "id": "HEAD"
                        },
                        "cartocss": "#points { marker-width: 10; marker-fill: red; }",
                        "cartocss_version": "2.3.0"
                    }
                }
            ],
            dataviews: dataviews,
            analyses: [
                {
                    "id": "HEAD",
                    "type": "source",
                    "params": {
                        "query": "select null::geometry the_geom_webmercator, x from generate_series(0,1000) x"
                    }
                }
            ]
        };
    }

    it('should fail when invalid dataviews object is provided, string case', function(done) {
        var mapConfig = createMapConfig("wadus-string");
        this.testClient = new TestClient(mapConfig, 1234);
        this.testClient.getLayergroup(ERROR_RESPONSE, function(err, errObj) {
            assert.ok(!err, err);

            assert.deepEqual(errObj.errors, [ '"dataviews" must be a valid JSON object: "string" type found' ]);

            done();
        });
    });

    it('should fail when invalid dataviews object is provided, array case', function(done) {
        var mapConfig = createMapConfig([]);
        this.testClient = new TestClient(mapConfig, 1234);
        this.testClient.getLayergroup(ERROR_RESPONSE, function(err, errObj) {
            assert.ok(!err, err);

            assert.deepEqual(errObj.errors, [ '"dataviews" must be a valid JSON object: "array" type found' ]);

            done();
        });
    });

    it('should work with empty but valid objects', function(done) {
        var mapConfig = createMapConfig({});
        this.testClient = new TestClient(mapConfig, 1234);
        this.testClient.getLayergroup(function(err, layergroup) {
            assert.ok(!err, err);

            assert.ok(layergroup);
            assert.ok(layergroup.layergroupid);

            done();
        });
    });
});
