import unittest
from collections import OrderedDict

from hashlib import sha1
from nyaa import utils


class TestUtils(unittest.TestCase):

    def test_sha1_hash(self):
        bencoded_test_data = b'd5:hello5:world7:numbersli1ei2eee'
        self.assertEqual(
            utils.sha1_hash(bencoded_test_data),
            sha1(bencoded_test_data).digest())

    def test_sorted_pathdict(self):
        initial = {
            'api_handler.py': 11805,
            'routes.py': 34247,
            '__init__.py': 6499,
            'torrents.py': 11948,
            'static': {
                'img': {
                    'nyaa.png': 1200,
                    'sukebei.png': 1100,
                },
                'js': {
                    'main.js': 3000,
                },
            },
            'search.py': 5148,
            'models.py': 24293,
            'templates': {
                'upload.html': 3000,
                'home.html': 1200,
                'layout.html': 23000,
            },
            'utils.py': 14700,
        }
        expected = OrderedDict({
            'static': OrderedDict({
                'img': OrderedDict({
                    'nyaa.png': 1200,
                    'sukebei.png': 1100,
                }),
                'js': OrderedDict({
                    'main.js': 3000,
                }),
            }),
            'templates': OrderedDict({
                'home.html': 1200,
                'layout.html': 23000,
                'upload.html': 3000,
            }),
            '__init__.py': 6499,
            'api_handler.py': 11805,
            'models.py': 24293,
            'routes.py': 34247,
            'search.py': 5148,
            'torrents.py': 11948,
            'utils.py': 14700,
        })
        self.assertDictEqual(utils.sorted_pathdict(initial), expected)

    @unittest.skip('Not yet implemented')
    def test_cached_function(self):
        # TODO: Test with a function that generates something random?
        pass

    def test_flatten_dict(self):
        initial = OrderedDict({
            'static': OrderedDict({
                'img': OrderedDict({
                    'nyaa.png': 1200,
                    'sukebei.png': 1100,
                }),
                'js': OrderedDict({
                    'main.js': 3000,
                }),
                'favicon.ico': 1000,
            }),
            'templates': [
                {'home.html': 1200},
                {'layout.html': 23000},
                {'upload.html': 3000},
            ],
            '__init__.py': 6499,
            'api_handler.py': 11805,
            'models.py': 24293,
            'routes.py': 34247,
            'search.py': 5148,
            'torrents.py': 11948,
            'utils.py': 14700,
        })
        expected = {
            'static/img/nyaa.png': 1200,
            'static/img/sukebei.png': 1100,
            'static/js/main.js': 3000,
            'static/favicon.ico': 1000,
            'templates/home.html': 1200,
            'templates/layout.html': 23000,
            'templates/upload.html': 3000,
            '__init__.py': 6499,
            'api_handler.py': 11805,
            'models.py': 24293,
            'routes.py': 34247,
            'search.py': 5148,
            'utils.py': 14700,
            'torrents.py': 11948,
        }
        self.assertDictEqual(utils.flatten_dict(initial), expected)


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