import {describe, it, expect} from 'test/lib/common';
import InfluxSeries from '../influx_series';

describe('when generating timeseries from influxdb response', function() {
  describe('given multiple fields for series', function() {
    var options = {
      alias: '',
      series: [
        {
          name: 'cpu',
          tags:  {app: 'test', server: 'server1'},
          columns: ['time', 'mean', 'max', 'min'],
          values: [[1431946625000, 10, 11, 9], [1431946626000, 20, 21, 19]]
        }
      ]
    };
    describe('and no alias', function() {
      it('should generate multiple datapoints for each column', function() {
        var series = new InfluxSeries(options);
        var result = series.getTimeSeries();

        expect(result.length).to.be(3);
        expect(result[0].target).to.be('cpu.mean {app: test, server: server1}');
        expect(result[0].datapoints[0][0]).to.be(10);
        expect(result[0].datapoints[0][1]).to.be(1431946625000);
        expect(result[0].datapoints[1][0]).to.be(20);
        expect(result[0].datapoints[1][1]).to.be(1431946626000);

        expect(result[1].target).to.be('cpu.max {app: test, server: server1}');
        expect(result[1].datapoints[0][0]).to.be(11);
        expect(result[1].datapoints[0][1]).to.be(1431946625000);
        expect(result[1].datapoints[1][0]).to.be(21);
        expect(result[1].datapoints[1][1]).to.be(1431946626000);

        expect(result[2].target).to.be('cpu.min {app: test, server: server1}');
        expect(result[2].datapoints[0][0]).to.be(9);
        expect(result[2].datapoints[0][1]).to.be(1431946625000);
        expect(result[2].datapoints[1][0]).to.be(19);
        expect(result[2].datapoints[1][1]).to.be(1431946626000);

      });
    });

    describe('and simple alias', function() {
      it('should use alias', function() {
        options.alias = 'new series';
        var series = new InfluxSeries(options);
        var result = series.getTimeSeries();

        expect(result[0].target).to.be('new series');
        expect(result[1].target).to.be('new series');
        expect(result[2].target).to.be('new series');
      });

    });

    describe('and alias patterns', function() {
      it('should replace patterns', function() {
        options.alias = 'alias: $m -> $tag_server ([[measurement]])';
        var series = new InfluxSeries(options);
        var result = series.getTimeSeries();

        expect(result[0].target).to.be('alias: cpu -> server1 (cpu)');
        expect(result[1].target).to.be('alias: cpu -> server1 (cpu)');
        expect(result[2].target).to.be('alias: cpu -> server1 (cpu)');
      });

    });
  });

  describe('given measurement with default fieldname', function() {
    var options = { series: [
      {
        name: 'cpu',
        tags:  {app: 'test', server: 'server1'},
        columns: ['time', 'value'],
        values: [["2015-05-18T10:57:05Z", 10], ["2015-05-18T10:57:06Z", 12]]
      },
      {
        name: 'cpu',
        tags:  {app: 'test2', server: 'server2'},
        columns: ['time', 'value'],
        values: [["2015-05-18T10:57:05Z", 15], ["2015-05-18T10:57:06Z", 16]]
      }
    ]};

    describe('and no alias', function() {

      it('should generate label with no field', function() {
        var series = new InfluxSeries(options);
        var result = series.getTimeSeries();

        expect(result[0].target).to.be('cpu {app: test, server: server1}');
        expect(result[1].target).to.be('cpu {app: test2, server: server2}');
      });
    });

  });

  describe('given two series', function() {
    var options = {
      alias: '',
      series: [
        {
          name: 'cpu',
          tags:  {app: 'test', server: 'server1'},
          columns: ['time', 'mean'],
          values: [[1431946625000, 10], [1431946626000, 12]]
        },
        {
          name: 'cpu',
          tags:  {app: 'test2', server: 'server2'},
          columns: ['time', 'mean'],
          values: [[1431946625000, 15], [1431946626000, 16]]
        }
      ]
    };

    describe('and no alias', function() {

      it('should generate two time series', function() {
        var series = new InfluxSeries(options);
        var result = series.getTimeSeries();

        expect(result.length).to.be(2);
        expect(result[0].target).to.be('cpu.mean {app: test, server: server1}');
        expect(result[0].datapoints[0][0]).to.be(10);
        expect(result[0].datapoints[0][1]).to.be(1431946625000);
        expect(result[0].datapoints[1][0]).to.be(12);
        expect(result[0].datapoints[1][1]).to.be(1431946626000);

        expect(result[1].target).to.be('cpu.mean {app: test2, server: server2}');
        expect(result[1].datapoints[0][0]).to.be(15);
        expect(result[1].datapoints[0][1]).to.be(1431946625000);
        expect(result[1].datapoints[1][0]).to.be(16);
        expect(result[1].datapoints[1][1]).to.be(1431946626000);
      });
    });

    describe('and simple alias', function() {
      it('should use alias', function() {
        options.alias = 'new series';
        var series = new InfluxSeries(options);
        var result = series.getTimeSeries();

        expect(result[0].target).to.be('new series');
      });

    });

    describe('and alias patterns', function() {
      it('should replace patterns', function() {
        options.alias = 'alias: $m -> $tag_server ([[measurement]])';
        var series = new InfluxSeries(options);
        var result = series.getTimeSeries();

        expect(result[0].target).to.be('alias: cpu -> server1 (cpu)');
        expect(result[1].target).to.be('alias: cpu -> server2 (cpu)');
      });

    });

  });

  describe('given measurement with dots', function() {
    var options = {
      alias: '',
      series: [
        {
          name: 'app.prod.server1.count',
          tags:  {},
          columns: ['time', 'mean'],
          values: [[1431946625000, 10], [1431946626000, 12]]
        }
      ]
    };

    it('should replace patterns', function() {
      options.alias = 'alias: $1 -> [[3]]';
      var series = new InfluxSeries(options);
      var result = series.getTimeSeries();

      expect(result[0].target).to.be('alias: prod -> count');
    });
  });

  describe('given table response', function() {
    var options = {
      alias: '',
      series: [
        {
          name: 'app.prod.server1.count',
          tags:  {datacenter: 'Africa', server: 'server2'},
          columns: ['time', 'value2', 'value'],
          values: [[1431946625000, 23, 10], [1431946626000, 25, 12]]
        }
      ]
    };

    it('should return table', function() {
      var series = new InfluxSeries(options);
      var table = series.getTable();

      expect(table.type).to.be('table');
      expect(table.columns.length).to.be(5);
      expect(table.rows[0]).to.eql([1431946625000, 'Africa', 'server2', 23, 10]);
    });
  });

  describe('given annotation response', function() {
    describe('with empty tagsColumn', function() {
      var options = {
        alias: '',
        annotation: {},
        series: [
          {
            name: "logins.count",
            tags:  {datacenter: 'Africa', server: 'server2'},
            columns: ["time", "datacenter", "hostname", "source", "value"],
            values: [
              [1481549440372, "America", "10.1.100.10", "backend", 215.7432653659507],
            ]
          }
        ]
      };

      it('should multiple tags', function() {
        var series = new InfluxSeries(options);
        var annotations = series.getAnnotations();

        expect(annotations[0].tags.length).to.be(0);
      });
    });

    describe('given annotation response', function() {
      var options = {
        alias: '',
        annotation: {
          tagsColumn: 'datacenter, source'
        },
        series: [
          {
            name: "logins.count",
            tags:  {datacenter: 'Africa', server: 'server2'},
            columns: ["time", "datacenter", "hostname", "source", "value"],
            values: [
              [1481549440372, "America", "10.1.100.10", "backend", 215.7432653659507],
            ]
          }
        ]
      };

      it('should multiple tags', function() {
        var series = new InfluxSeries(options);
        var annotations = series.getAnnotations();

        expect(annotations[0].tags.length).to.be(2);
        expect(annotations[0].tags[0]).to.be('America');
        expect(annotations[0].tags[1]).to.be('backend');
      });
    });
  });
});

