/*
 * © 2021 Thoughtworks, Inc.
 */
import { MetricDataResult } from 'aws-sdk/clients/cloudwatch'

import ComputeUsage, {
  buildComputeUsages,
  extractRawComputeUsages,
  RawComputeUsage,
} from '../ComputeUsage'
import CloudConstants from '../../CloudConstantsTypes'

describe('ComputeUsage', () => {
  const dayOneHourOne = '2020-07-10T22:00:00.000Z'
  const dayTwoHourOne = '2020-07-11T00:00:00.000Z'
  const dayTwoHourTwo = '2020-07-11T01:00:00.000Z'

  it('buildComputeUsages', () => {
    // given
    const rawComputeUsages: RawComputeUsage[] = [
      {
        timestamp: dayOneHourOne,
        id: 'cpuUtilization',
        value: 31.435897435897434,
      },
      {
        timestamp: dayOneHourOne,
        id: 'cpuUtilization',
        value: 11.576923076923077,
      },
      {
        timestamp: dayTwoHourOne,
        id: 'cpuUtilization',
        value: 9.716666666666667,
      },
      {
        timestamp: dayTwoHourTwo,
        id: 'cpuUtilization',
        value: 20.46153846153846,
      },
      {
        timestamp: dayOneHourOne,
        id: 'cpuUtilization',
        value: 9.63265306122449,
      },
      {
        timestamp: dayTwoHourOne,
        id: 'cpuUtilization',
        value: 13.083333333333334,
      },
      {
        timestamp: dayTwoHourTwo,
        id: 'cpuUtilization',
        value: 32.44444444444444,
      },
      {
        timestamp: dayTwoHourTwo,
        id: 'cpuUtilization',
        value: 10.26923076923077,
      },
      {
        timestamp: dayTwoHourTwo,
        id: 'cpuUtilization',
        value: 9.75,
      },
      {
        timestamp: dayOneHourOne,
        id: 'cpuUtilization',
        value: 24.25,
      },
      { timestamp: dayOneHourOne, id: 'vCPUs', value: 4.5 },
      { timestamp: dayTwoHourOne, id: 'vCPUs', value: 4 },
      {
        timestamp: dayTwoHourTwo,
        id: 'vCPUs',
        value: 4.333333333333333,
      },
    ]

    const cloudConstants: CloudConstants = {
      avgCpuUtilization: 50,
    }

    // when
    const result = buildComputeUsages(rawComputeUsages, cloudConstants)

    // then
    const expectedResult: ComputeUsage[] = [
      {
        cpuUtilizationAverage: 19.22386839351125,
        vCpuHours: 4.5,
        timestamp: new Date(dayOneHourOne),
        usesAverageCPUConstant: false,
      },
      {
        cpuUtilizationAverage: 11.4,
        vCpuHours: 4,
        timestamp: new Date(dayTwoHourOne),
        usesAverageCPUConstant: false,
      },
      {
        cpuUtilizationAverage: 18.231303418803417,
        vCpuHours: 4.333333333333333,
        timestamp: new Date(dayTwoHourTwo),
        usesAverageCPUConstant: false,
      },
    ]

    expect(result).toEqual(expectedResult)
  })

  it('buildComputeUsages using cloud constant for average CPOU Utilization', () => {
    const rawComputeUsages: RawComputeUsage[] = [
      { timestamp: dayOneHourOne, id: 'vCPUs', value: 4.5 },
    ]

    const cloudConstants: CloudConstants = {
      avgCpuUtilization: 50,
    }

    const result = buildComputeUsages(rawComputeUsages, cloudConstants)

    const expectedResults = [
      {
        cpuUtilizationAverage: 50,
        vCpuHours: 4.5,
        timestamp: new Date(dayOneHourOne),
        usesAverageCPUConstant: true,
      },
    ]
    expect(result).toEqual(expectedResults)
  })

  it('extractRawComputeUsages', () => {
    const testMetricId = 'test-metric-id'
    const metricDataResult: MetricDataResult = {
      Id: testMetricId,
      Timestamps: [new Date('2021-01-01'), new Date('2021-01-02')],
      Values: [10, 20],
    }
    const result = extractRawComputeUsages(metricDataResult)

    const expectedResults: RawComputeUsage[] = [
      { id: testMetricId, timestamp: '2021-01-01T00:00:00.000Z', value: 10 },
      { id: testMetricId, timestamp: '2021-01-02T00:00:00.000Z', value: 20 },
    ]

    expect(result).toEqual(expectedResults)
  })
})
