import type {MonitorBucketEnvMapping} from 'sentry/views/monitors/components/timeline/types';

import {mergeEnvMappings} from './mergeEnvMappings';

describe('mergeEnvMappings', function () {
  it('merges two empty mappings', function () {
    const envMappingA: MonitorBucketEnvMapping = {};
    const envMappingB: MonitorBucketEnvMapping = {};
    const mergedMapping = mergeEnvMappings(envMappingA, envMappingB);

    expect(mergedMapping).toEqual({});
  });

  it('merges one empty mapping with one filled mapping', function () {
    const envMappingA: MonitorBucketEnvMapping = {};
    const envMappingB: MonitorBucketEnvMapping = {
      prod: {in_progress: 0, ok: 1, missed: 0, timeout: 0, error: 0},
    };
    const mergedMapping = mergeEnvMappings(envMappingA, envMappingB);

    expect(mergedMapping).toEqual(envMappingB);
  });

  it('merges two filled mappings', function () {
    const envMappingA: MonitorBucketEnvMapping = {
      prod: {in_progress: 0, ok: 0, missed: 1, timeout: 2, error: 1},
    };
    const envMappingB: MonitorBucketEnvMapping = {
      prod: {in_progress: 2, ok: 1, missed: 1, timeout: 0, error: 2},
    };
    const expectedMerged: MonitorBucketEnvMapping = {
      prod: {in_progress: 2, ok: 1, missed: 2, timeout: 2, error: 3},
    };
    const mergedMapping = mergeEnvMappings(envMappingA, envMappingB);

    expect(mergedMapping).toEqual(expectedMerged);
  });

  it('merges two filled mappings with differing envs', function () {
    const envMappingA: MonitorBucketEnvMapping = {
      prod: {in_progress: 1, ok: 0, missed: 1, timeout: 2, error: 1},
    };
    const envMappingB: MonitorBucketEnvMapping = {
      dev: {in_progress: 0, ok: 1, missed: 1, timeout: 0, error: 2},
    };
    const expectedMerged: MonitorBucketEnvMapping = {
      prod: {in_progress: 1, ok: 0, missed: 1, timeout: 2, error: 1},
      dev: {in_progress: 0, ok: 1, missed: 1, timeout: 0, error: 2},
    };
    const mergedMapping = mergeEnvMappings(envMappingA, envMappingB);

    expect(mergedMapping).toEqual(expectedMerged);
  });
});
