"""Mapping rules that turn WordPress data into portal data."""
from django.test import SimpleTestCase

from accounts.tests.test_hashers import WP_FIXTURES
from accounts.wp_import import (
    hash_format,
    parse_wp_roles,
    relpath_from_upload_url,
    slugify_category,
    wp_hash_to_django,
)


class HashRoutingTests(SimpleTestCase):
    def test_routes_each_wordpress_format_to_its_verifier(self):
        _plain, wp68, phpass = WP_FIXTURES[0]
        self.assertEqual(wp_hash_to_django(phpass), "wp_phpass$" + phpass)
        self.assertEqual(wp_hash_to_django(wp68), "wp_bcrypt$" + wp68)
        self.assertTrue(wp_hash_to_django("$2y$10$abc").startswith("wp_bcrypt$"))

    def test_unrecognised_or_empty_hash_returns_none(self):
        # None means "import the account with an unusable password", never a guess.
        self.assertIsNone(wp_hash_to_django(""))
        self.assertIsNone(wp_hash_to_django(None))
        self.assertIsNone(wp_hash_to_django("plaintext-oh-no"))

    def test_routed_hash_actually_verifies(self):
        from django.contrib.auth.hashers import check_password

        plain, wp68, phpass = WP_FIXTURES[1]
        self.assertTrue(check_password(plain, wp_hash_to_django(wp68)))
        self.assertTrue(check_password(plain, wp_hash_to_django(phpass)))

    def test_hash_format_labels(self):
        _plain, wp68, phpass = WP_FIXTURES[0]
        self.assertEqual(hash_format(phpass), "phpass")
        self.assertEqual(hash_format(wp68), "wp6.8")
        self.assertEqual(hash_format("$2y$10$x"), "bcrypt")
        self.assertEqual(hash_format(""), "empty")
        self.assertEqual(hash_format("???"), "unknown")


class RoleParsingTests(SimpleTestCase):
    def test_parses_serialised_capabilities(self):
        self.assertEqual(parse_wp_roles('a:1:{s:5:"owner";b:1;}'), ["owner"])
        self.assertEqual(
            parse_wp_roles('a:1:{s:13:"administrator";b:1;}'), ["administrator"]
        )

    def test_parses_multiple_roles(self):
        caps = 'a:2:{s:5:"owner";b:1;s:15:"bbp_participant";b:1;}'
        self.assertEqual(parse_wp_roles(caps), ["owner", "bbp_participant"])

    def test_empty_capabilities(self):
        self.assertEqual(parse_wp_roles(""), [])
        self.assertEqual(parse_wp_roles(None), [])


class PathAndSlugTests(SimpleTestCase):
    def test_slugify(self):
        self.assertEqual(slugify_category("Minutes & Financials"), "minutes-financials")
        self.assertEqual(slugify_category("Owner's Newsletters"), "owner-s-newsletters")

    def test_relpath_from_plain_uploads_url(self):
        self.assertEqual(
            relpath_from_upload_url("https://x.com/wp-content/uploads/2018/07/a.pdf"),
            "2018/07/a.pdf",
        )

    def test_relpath_from_protected_bw_file_url(self):
        # The Palms rewrote migrated URLs to /bw-file/<id>/<name>.
        self.assertEqual(
            relpath_from_upload_url("https://x.com/bw-file/135/2018-agm.pdf"),
            "2018-agm.pdf",
        )

    def test_relpath_none(self):
        self.assertIsNone(relpath_from_upload_url(""))
        self.assertIsNone(relpath_from_upload_url("https://x.com/unrelated"))

