def test_put_metric_data_invalid_parameter(aws_client):
    time_stamp = datetime.today()
    client = MagicMock()
    aws_client.return_value = client
    client.put_metric_data.side_effect = mock_client_error(
        op="PutMetricData",
        Code="InvalidParameterValueException",
        Message="An error occurred when calling PutMetricData",
    )

    with pytest.raises(FailedActivity) as x:
        put_metric_data(
            namespace="TestMetricNamespace",
            metric_data=[{
                "MetricName":
                "MemoryUtilization",
                "Dimensions": [{
                    "Name": "InstanceId",
                    "Value": "i-000000000000"
                }],
                "Timestamp":
                time_stamp,
                "Value":
                85.568945236,
                "Unit":
                "InvalidUnit",
                "StorageResolution":
                60,
            }],
        )
    assert "An error occurred when calling PutMetricData" in str(x)
def test_put_metric_data_invalid_parameter(aws_client):
    time_stamp = datetime.today()
    client = MagicMock()
    aws_client.return_value = client
    client.put_metric_data.side_effect = mock_client_error(
        op='PutMetricData',
        Code='InvalidParameterValueException',
        Message='An error occurred when calling PutMetricData')

    with pytest.raises(FailedActivity) as x:
        put_metric_data(namespace='TestMetricNamespace',
                        metric_data=[{
                            'MetricName':
                            'MemoryUtilization',
                            'Dimensions': [{
                                'Name': 'InstanceId',
                                'Value': 'i-000000000000'
                            }],
                            'Timestamp':
                            time_stamp,
                            'Value':
                            85.568945236,
                            'Unit':
                            'InvalidUnit',
                            'StorageResolution':
                            60
                        }])
    assert 'An error occurred when calling PutMetricData' in str(x)
def test_put_metric_data_valid_multi_datapoints(aws_client):
    time_stamp = datetime.today()
    client = MagicMock()
    aws_client.return_value = client
    client.put_metric_data.return_value = None

    put_metric_data(
        namespace="TestMetricNamespace",
        metric_data=[{
            "MetricName":
            "MemoryUtilization",
            "Dimensions": [{
                "Name": "InstanceId",
                "Value": "i-000000000000"
            }],
            "Timestamp":
            time_stamp,
            "Values": [5.5, 10.2, 6.5],
            "Counts": [1, 3, 2.6],
            "Unit":
            "Percent",
            "StorageResolution":
            60,
        }],
    )

    client.put_metric_data.assert_called_with(
        Namespace="TestMetricNamespace",
        MetricData=[{
            "MetricName":
            "MemoryUtilization",
            "Dimensions": [{
                "Name": "InstanceId",
                "Value": "i-000000000000"
            }],
            "Timestamp":
            time_stamp,
            "Values": [5.5, 10.2, 6.5],
            "Counts": [1, 3, 2.6],
            "Unit":
            "Percent",
            "StorageResolution":
            60,
        }],
    )
def test_put_metric_data_valid_multi_datapoints(aws_client):
    time_stamp = datetime.today()
    client = MagicMock()
    aws_client.return_value = client
    client.put_metric_data.return_value = None

    put_metric_data(namespace='TestMetricNamespace',
                    metric_data=[{
                        'MetricName':
                        'MemoryUtilization',
                        'Dimensions': [{
                            'Name': 'InstanceId',
                            'Value': 'i-000000000000'
                        }],
                        'Timestamp':
                        time_stamp,
                        'Values': [5.5, 10.2, 6.5],
                        'Counts': [1, 3, 2.6],
                        'Unit':
                        'Percent',
                        'StorageResolution':
                        60
                    }])

    client.put_metric_data.assert_called_with(Namespace='TestMetricNamespace',
                                              MetricData=[{
                                                  'MetricName':
                                                  'MemoryUtilization',
                                                  'Dimensions': [{
                                                      'Name':
                                                      'InstanceId',
                                                      'Value':
                                                      'i-000000000000'
                                                  }],
                                                  'Timestamp':
                                                  time_stamp,
                                                  'Values': [5.5, 10.2, 6.5],
                                                  'Counts': [1, 3, 2.6],
                                                  'Unit':
                                                  'Percent',
                                                  'StorageResolution':
                                                  60
                                              }])
def test_put_metric_data_valid_single_datapoint(aws_client):
    client = MagicMock()
    aws_client.return_value = client
    client.put_metric_data.return_value = None
    time_stamp_1 = datetime.today() - timedelta(minutes=2)
    time_stamp_2 = datetime.today()

    put_metric_data(
        namespace="TestMetricNamespace",
        metric_data=[
            {
                "MetricName": "MemoryUtilization",
                "Dimensions": [{
                    "Name": "InstanceId",
                    "Value": "i-000000000000"
                }],
                "Timestamp": time_stamp_1,
                "Value": 85.568945236,
                "Unit": "Percent",
                "StorageResolution": 60,
            },
            {
                "MetricName": "MemoryUtilization",
                "Dimensions": [{
                    "Name": "InstanceId",
                    "Value": "i-000000000000"
                }],
                "Timestamp": time_stamp_2,
                "Value": 89.6854,
                "Unit": "Percent",
                "StorageResolution": 60,
            },
        ],
    )

    client.put_metric_data.assert_called_with(
        Namespace="TestMetricNamespace",
        MetricData=[
            {
                "MetricName": "MemoryUtilization",
                "Dimensions": [{
                    "Name": "InstanceId",
                    "Value": "i-000000000000"
                }],
                "Timestamp": time_stamp_1,
                "Value": 85.568945236,
                "Unit": "Percent",
                "StorageResolution": 60,
            },
            {
                "MetricName": "MemoryUtilization",
                "Dimensions": [{
                    "Name": "InstanceId",
                    "Value": "i-000000000000"
                }],
                "Timestamp": time_stamp_2,
                "Value": 89.6854,
                "Unit": "Percent",
                "StorageResolution": 60,
            },
        ],
    )
def test_put_metric_data_valid_single_datapoint(aws_client):
    client = MagicMock()
    aws_client.return_value = client
    client.put_metric_data.return_value = None
    time_stamp_1 = datetime.today() - timedelta(minutes=2)
    time_stamp_2 = datetime.today()

    put_metric_data(namespace='TestMetricNamespace',
                    metric_data=[{
                        'MetricName':
                        'MemoryUtilization',
                        'Dimensions': [{
                            'Name': 'InstanceId',
                            'Value': 'i-000000000000'
                        }],
                        'Timestamp':
                        time_stamp_1,
                        'Value':
                        85.568945236,
                        'Unit':
                        'Percent',
                        'StorageResolution':
                        60
                    }, {
                        'MetricName':
                        'MemoryUtilization',
                        'Dimensions': [{
                            'Name': 'InstanceId',
                            'Value': 'i-000000000000'
                        }],
                        'Timestamp':
                        time_stamp_2,
                        'Value':
                        89.6854,
                        'Unit':
                        'Percent',
                        'StorageResolution':
                        60
                    }])

    client.put_metric_data.assert_called_with(Namespace='TestMetricNamespace',
                                              MetricData=[{
                                                  'MetricName':
                                                  'MemoryUtilization',
                                                  'Dimensions': [{
                                                      'Name':
                                                      'InstanceId',
                                                      'Value':
                                                      'i-000000000000'
                                                  }],
                                                  'Timestamp':
                                                  time_stamp_1,
                                                  'Value':
                                                  85.568945236,
                                                  'Unit':
                                                  'Percent',
                                                  'StorageResolution':
                                                  60
                                              }, {
                                                  'MetricName':
                                                  'MemoryUtilization',
                                                  'Dimensions': [{
                                                      'Name':
                                                      'InstanceId',
                                                      'Value':
                                                      'i-000000000000'
                                                  }],
                                                  'Timestamp':
                                                  time_stamp_2,
                                                  'Value':
                                                  89.6854,
                                                  'Unit':
                                                  'Percent',
                                                  'StorageResolution':
                                                  60
                                              }])