import unittest

import pytest

wptserve = pytest.importorskip("wptserve")
from .base import TestUsingServer


class TestResponseSetCookie(TestUsingServer):
    def test_name_value(self):
        @wptserve.handlers.handler
        def handler(request, response):
            response.set_cookie("name", "value")
            return "Test"

        route = ("GET", "/test/name_value", handler)
        self.server.router.register(*route)
        resp = self.request(route[1])

        self.assertEqual(resp.info()["Set-Cookie"], "name=value; Path=/")

    def test_unset(self):
        @wptserve.handlers.handler
        def handler(request, response):
            response.set_cookie("name", "value")
            response.unset_cookie("name")
            return "Test"

        route = ("GET", "/test/unset", handler)
        self.server.router.register(*route)
        resp = self.request(route[1])

        self.assertTrue("Set-Cookie" not in resp.info())

    def test_delete(self):
        @wptserve.handlers.handler
        def handler(request, response):
            response.delete_cookie("name")
            return "Test"

        route = ("GET", "/test/delete", handler)
        self.server.router.register(*route)
        resp = self.request(route[1])

        parts = dict(item.split("=") for
                     item in resp.info()["Set-Cookie"].split("; ") if item)

        self.assertEqual(parts["name"], "")
        self.assertEqual(parts["Path"], "/")
        #Should also check that expires is in the past

class TestRequestCookies(TestUsingServer):
    def test_set_cookie(self):
        @wptserve.handlers.handler
        def handler(request, response):
            return request.cookies["name"].value

        route = ("GET", "/test/set_cookie", handler)
        self.server.router.register(*route)
        resp = self.request(route[1], headers={"Cookie": "name=value"})
        self.assertEqual(resp.read(), b"value")

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