# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
#     http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.

import difflib

from awscli.testutils import mock, unittest
from awscli.compat import six
from awscli.customizations.datapipeline.listrunsformatter \
    import ListRunsFormatter


class TestListRunsFormatter(unittest.TestCase):
    def setUp(self):
        self.formatter = ListRunsFormatter(mock.Mock(query=None))
        self.stream = six.StringIO()

    def assert_data_renders_to(self, data, table):
        self.formatter('list-runs', data, stream=self.stream)
        rendered = self.stream.getvalue()

        differ = difflib.Differ()
        diff = differ.compare(table.splitlines(1), rendered.splitlines(1))

        self.assertEqual(table, rendered, msg='\n' + '\n'.join(diff))

    def test_empty(self):
        self.assert_data_renders_to(
            [],
            "       Name                                                Scheduled Start      Status                 \n"  # noqa
            "       ID                                                  Started              Ended              \n"  # noqa
            "---------------------------------------------------------------------------------------------------\n")  # noqa

    def test_single_row(self):
        self.assert_data_renders_to(
            [{
                 '@componentParent': 'parent',
                 '@id': 'id',
                 '@scheduledStartTime': 'now',
                 '@status': 'status',
                 '@actualStartTime': 'actualStartTime',
                 '@actualEndTime': 'actualEndTime',
             }],
            "       Name                                                Scheduled Start      Status                 \n"  # noqa
            "       ID                                                  Started              Ended              \n"  # noqa
            "---------------------------------------------------------------------------------------------------\n"  # noqa
            "   1.  parent                                              now                  status                 \n"  # noqa
            "       id                                                  actualStartTime      actualEndTime      \n"  # noqa
            "\n"
        )