averias/redis-time-series

View on GitHub
src/__tests__/integration/multiRange.test.ts

Summary

Maintainability
F
1 wk
Test Coverage
import { RedisTimeSeriesFactory } from "../../factory/redisTimeSeries";
import { testOptions } from "../../__tests_config__/data";
import { Sample } from "../../entity/sample";
import { Aggregation } from "../../entity/aggregation";
import { AggregationType } from "../../enum/aggregationType";
import { TimestampRange } from "../../entity/timestampRange";
import { Label } from "../../entity/label";
import { FilterBuilder } from "../../builder/filterBuilder";

const factory = new RedisTimeSeriesFactory(testOptions);
const rtsClient = factory.create();
const date = new Date(2019, 11, 24, 19).getTime();

const label1 = new Label("label", "1");
const sensor1 = new Label("sensor", "1");
const sensor2 = new Label("sensor", "2");
const sensor3 = new Label("sensor", "3");
const sensorString = new Label("sensor", "sensorvalue");

beforeAll(async () => {
    await rtsClient.create("multirange1", [label1, sensor1]);
    await rtsClient.create("multirange2", [label1, sensor2]);
    await rtsClient.create("multirange3", [sensor2, sensor3]);
    await rtsClient.create("multirange4", [sensorString]);

    for (let i = 0; i < 10; i++) {
        await rtsClient.add(new Sample("multirange1", 20 + i, date + i * 1000));
        await rtsClient.add(new Sample("multirange2", 30 + i, date + i * 1000));
        await rtsClient.add(new Sample("multirange3", 40 + i, date + i * 1000));
        await rtsClient.add(new Sample("multirange4", 50 + i, date + i * 1000));
    }
});

afterAll(async () => {
    await rtsClient.delete("multirange1", "multirange2", "multirange3", "multirange4");
    await rtsClient.disconnect();
});

test("sum aggregated query multi range with label1 filter successfully", async () => {
    const aggregation = new Aggregation(AggregationType.SUM, 5000);
    const timestampRange = new TimestampRange(date, date + 10000);
    const filter = new FilterBuilder("label", 1);
    const multiRanges = await rtsClient.multiRange(timestampRange, filter, undefined, aggregation, true);
    expect(Array.isArray(multiRanges)).toBe(true);

    const multiRange1 = multiRanges.shift();
    expect(multiRange1).not.toEqual(undefined);
    // @ts-ignore
    expect(multiRange1.key).toEqual("multirange1");
    // @ts-ignore
    const labels1 = multiRange1.labels;
    expect(labels1.shift()).toEqual(label1);
    expect(labels1.shift()).toEqual(sensor1);

    // @ts-ignore
    const samples1 = multiRange1.data;
    // @ts-ignore
    expect(samples1.shift().getValue()).toEqual(110);
    // @ts-ignore
    expect(samples1.shift().getValue()).toEqual(135);

    const multiRange2 = multiRanges.shift();
    expect(multiRange2).not.toEqual(undefined);
    // @ts-ignore
    expect(multiRange2.key).toEqual("multirange2");
    // @ts-ignore
    const labels2 = multiRange2.labels;
    expect(labels2.shift()).toEqual(label1);
    expect(labels2.shift()).toEqual(sensor2);

    // @ts-ignore
    const samples2 = multiRange2.data;
    // @ts-ignore
    expect(samples2.shift().getValue()).toEqual(160);
    // @ts-ignore
    expect(samples2.shift().getValue()).toEqual(185);

    expect(multiRanges.length).toBe(0);
});

test("max aggregated query multi range with label1 and sensor1 filters successfully", async () => {
    const aggregation = new Aggregation(AggregationType.MAX, 5000);
    const timestampRange = new TimestampRange(date, date + 10000);
    const filter = new FilterBuilder("label", 1).equal("sensor", 1);
    const multiRanges = await rtsClient.multiRange(timestampRange, filter, undefined, aggregation, true);
    expect(Array.isArray(multiRanges)).toBe(true);

    const multiRange = multiRanges.shift();
    expect(multiRange).not.toEqual(undefined);
    // @ts-ignore
    expect(multiRange.key).toEqual("multirange1");
    // @ts-ignore
    const labels = multiRange.labels;
    expect(labels.shift()).toEqual(label1);
    expect(labels.shift()).toEqual(sensor1);

    // @ts-ignore
    const samples = multiRange.data;
    // @ts-ignore
    expect(samples.shift().getValue()).toEqual(24);
    // @ts-ignore
    expect(samples.shift().getValue()).toEqual(29);

    expect(multiRanges.length).toBe(0);
});

test("max aggregated query multi range with sensor string filter successfully", async () => {
    const aggregation = new Aggregation(AggregationType.MAX, 5000);
    const timestampRange = new TimestampRange(date, date + 10000);
    const filter = new FilterBuilder("sensor", "sensorvalue");
    const multiRanges = await rtsClient.multiRange(timestampRange, filter, undefined, aggregation, true);
    expect(Array.isArray(multiRanges)).toBe(true);

    const multiRange = multiRanges.shift();
    expect(multiRange).not.toEqual(undefined);
    // @ts-ignore
    expect(multiRange.key).toEqual("multirange4");
    // @ts-ignore
    const labels = multiRange.labels;
    expect(labels.shift()).toEqual(sensorString);

    // @ts-ignore
    const samples = multiRange.data;
    // @ts-ignore
    expect(samples.shift().getValue()).toEqual(54);
    // @ts-ignore
    expect(samples.shift().getValue()).toEqual(59);

    expect(multiRanges.length).toBe(0);
});

test("min aggregated query multi range with not label1 ans sensor2 filters successfully", async () => {
    const aggregation = new Aggregation(AggregationType.MIN, 5000);
    const timestampRange = new TimestampRange(date, date + 10000);
    const filter = new FilterBuilder("sensor", 2).notEqual("label", 1);
    const multiRanges = await rtsClient.multiRange(timestampRange, filter, undefined, aggregation, true);
    expect(Array.isArray(multiRanges)).toBe(true);

    const multiRange = multiRanges.shift();
    expect(multiRange).not.toEqual(undefined);
    // @ts-ignore
    expect(multiRange.key).toEqual("multirange3");
    // @ts-ignore
    const labels = multiRange.labels;
    expect(labels.shift()).toEqual(sensor2);
    expect(labels.shift()).toEqual(sensor3);

    // @ts-ignore
    const samples = multiRange.data;
    // @ts-ignore
    expect(samples.shift().getValue()).toEqual(40);
    // @ts-ignore
    expect(samples.shift().getValue()).toEqual(45);

    expect(multiRanges.length).toBe(0);
});

test("count aggregated query multi range with filters not matching", async () => {
    const aggregation = new Aggregation(AggregationType.COUNT, 5000);
    const timestampRange = new TimestampRange(date, date + 10000);
    const filter = new FilterBuilder("sensor", 3).notIn("sensor", [1, 2]);
    const multiRanges = await rtsClient.multiRange(timestampRange, filter, undefined, aggregation);
    expect(Array.isArray(multiRanges)).toBe(true);
    expect(multiRanges.length).toBe(0);
});

test("max aggregated query multi range with sensor3 filter and count optional param", async () => {
    const aggregation = new Aggregation(AggregationType.MAX, 5000);
    const timestampRange = new TimestampRange(date, date + 10000);
    const filter = new FilterBuilder("sensor", 3).notEqual("label", 1);
    const multiRanges = await rtsClient.multiRange(timestampRange, filter, 1, aggregation, true);
    expect(Array.isArray(multiRanges)).toBe(true);

    const multiRange = multiRanges.shift();
    expect(multiRange).not.toEqual(undefined);
    // @ts-ignore
    expect(multiRange.key).toEqual("multirange3");
    // @ts-ignore
    const labels = multiRange.labels;
    expect(labels.shift()).toEqual(sensor2);
    expect(labels.shift()).toEqual(sensor3);

    // @ts-ignore
    const samples = multiRange.data;
    // @ts-ignore
    expect(samples.shift().getValue()).toEqual(44);

    expect(samples.length).toBe(0);
    expect(multiRanges.length).toBe(0);
});

test("aggregated query multi range with filter not matching", async () => {
    const aggregation = new Aggregation(AggregationType.COUNT, 5000);
    const timestampRange = new TimestampRange(date, date + 10000);
    const filter = new FilterBuilder("sensor", 3).notIn("sensor", [1, 2]);
    const multiRanges = await rtsClient.multiRange(timestampRange, filter, undefined, aggregation, true);
    expect(Array.isArray(multiRanges)).toBe(true);
    expect(multiRanges.length).toBe(0);
});

test("aggregated query multi range with default timestamp and without labels", async () => {
    const timestampRange = new TimestampRange();
    const filter = new FilterBuilder("sensor", 3).notEqual("label", 1);
    const multiRanges = await rtsClient.multiRange(timestampRange, filter, 3);
    expect(Array.isArray(multiRanges)).toBe(true);

    const multiRange = multiRanges.shift();
    expect(multiRange).not.toEqual(undefined);
    // @ts-ignore
    expect(multiRange.key).toEqual("multirange3");
    // @ts-ignore
    expect(multiRange.labels.length).toBe(0);

    // @ts-ignore
    const samples = multiRange.data;
    // @ts-ignore
    expect(samples.shift().getValue()).toEqual(40);
    // @ts-ignore
    expect(samples.shift().getValue()).toEqual(41);
    // @ts-ignore
    expect(samples.shift().getValue()).toEqual(42);

    expect(samples.length).toBe(0);
    expect(multiRanges.length).toBe(0);
});

test("aggregated query multi range with timestamp range not matching", async () => {
    const now = Date.now();
    const start = now - 10000;
    const timestampRange = new TimestampRange(start, now);
    const filter = new FilterBuilder("sensor", 3);
    for (const key in AggregationType) {
        const aggregationType = AggregationType[key];
        const aggregation = new Aggregation(aggregationType, 5000);
        const multiRanges = await rtsClient.multiRange(timestampRange, filter, undefined, aggregation, true);
        expect(Array.isArray(multiRanges)).toBe(true);

        const multiRange1 = multiRanges.shift();
        expect(multiRange1).not.toEqual(undefined);
        // @ts-ignore
        expect(multiRange1.key).toEqual("multirange3");
        // @ts-ignore
        const labels1 = multiRange1.labels;
        expect(labels1.shift()).toEqual(sensor2);
        expect(labels1.shift()).toEqual(sensor3);

        // @ts-ignore
        const samples = multiRange1.data;
        const sample1 = samples.shift();

        if (aggregationType === "count") {
            // @ts-ignore
            expect(sample1.getValue()).toEqual(0);
            // @ts-ignore
            expect(sample1.getTimestamp()).toEqual(date);
        } else {
            // @ts-ignore
            expect(sample1).toEqual(undefined);
        }

        expect(samples.length).toBe(0);
        expect(multiRanges.length).toBe(0);
    }
});