#!/usr/bin/env python
"""
Python tests for Mime-Type Parser.

This module loads a json file and converts the tests specified therein to a set
of PyUnitTestCases. Then it uses PyUnit to run them and report their status.
"""
import json
import unittest

import mimeparse


__version__ = "0.1"
__author__ = 'Ade Oshineye'
__email__ = "ade@oshineye.com"
__credits__ = ""


class MimeParseTestCase(unittest.TestCase):

    def setUp(self):
        super().setUp()
        with open("testdata.json") as f:
            self.test_data = json.load(f)

    def _test_parse_media_range(self, args, expected):
        expected = tuple(expected)
        result = mimeparse.parse_media_range(args)
        message = f"Expected: '{expected}' but got {result}"
        self.assertEqual(expected, result, message)

    def _test_quality(self, args, expected):
        result = mimeparse.quality(args[0], args[1])
        message = f"Expected: '{expected}' but got {result}"
        self.assertEqual(expected, result, message)

    def _test_best_match(self, args, expected, description):
        if expected is None:
            self.assertRaises(mimeparse.MimeTypeParseException,
                              mimeparse.best_match, args[0], args[1])
        else:
            result = mimeparse.best_match(args[0], args[1])
            message = \
                "Expected: '%s' but got %s. Description for this test: %s" % \
                (expected, result, description)
            self.assertEqual(expected, result, message)

    def _test_parse_mime_type(self, args, expected):
        if expected is None:
            self.assertRaises(mimeparse.MimeTypeParseException,
                              mimeparse.parse_mime_type, args)
        else:
            expected = tuple(expected)
            result = mimeparse.parse_mime_type(args)
            message = f"Expected: '{expected}' but got {result}"
            self.assertEqual(expected, result, message)

    def test_parse_media_range(self):
        for args, expected in self.test_data['parse_media_range']:
            self._test_parse_media_range(args, expected)

    def test_quality(self):
        for args, expected in self.test_data['quality']:
            self._test_quality(args, expected)

    def test_best_match(self):
        for args, expected, description in self.test_data['best_match']:
            self._test_best_match(args, expected, description)

    def test_parse_mime_type(self):
        for args, expected in self.test_data['parse_mime_type']:
            self._test_parse_mime_type(args, expected)


if __name__ == '__main__':
    unittest.main()
