local helpers = require "spec.helpers"

for _, strategy in helpers.each_strategy() do
    describe("Plugin: force-https [#" .. strategy .. "]", function()
        local proxy_client

        lazy_setup(function()
            local bp = helpers.get_db_utils(strategy,
                                            {"routes", "services", "plugins"})

            local service1 = bp.services:insert{
                protocol = "http",
                host = helpers.mock_upstream_host,
                port = helpers.mock_upstream_port
            }

            local route1 = bp.routes:insert{
                protocols = {"http", "https"},
                hosts = {"test1.com"},
                service = service1
            }

            local route2 = bp.routes:insert{
                protocols = {"http", "https"},
                hosts = {"test2.com"},
                service = service1
            }

            local route3 = bp.routes:insert{
                protocols = {"http", "https"},
                hosts = {"test3.com"},
                service = service1
            }

            bp.plugins:insert{
                route = {id = route2.id},
                name = "path-deny",
                config = {deny_paths = {"/status/200", "/status/500"}}
            }

            bp.plugins:insert{
                route = {id = route3.id},
                name = "path-deny",
                config = {deny_paths = {"/(.*)"}}
            }

            assert(helpers.start_kong({
                database = strategy,
                nginx_conf = "spec/fixtures/custom_nginx.template",
                plugins = "path-deny"
            }))
        end)

        lazy_teardown(function()
            helpers.stop_kong()
        end)

        before_each(function()
            proxy_client = helpers.proxy_client()
        end)

        after_each(function()
            if proxy_client then
                proxy_client:close()
            end
        end)

        describe("Normal", function()
            it("/status/200 return 200", function()
                local res = assert(proxy_client:send({
                    method = "GET",
                    path = "/status/200",
                    headers = {["Host"] = "test1.com"}
                }))
                assert.res_status(200, res)
            end)

            it("/status/500 return 500", function()
                local res = assert(proxy_client:send({
                    method = "GET",
                    path = "/status/500",
                    headers = {["Host"] = "test1.com"}
                }))
                assert.res_status(500, res)
            end)

            it("/request return 200", function()
                local res = assert(proxy_client:send({
                    method = "GET",
                    path = "/request",
                    headers = {["Host"] = "test1.com"}
                }))
                assert.res_status(200, res)
            end)
        end)

        describe("Detail Path Block", function()
            it("/status/200 return 403", function()
                local res = assert(proxy_client:send({
                    method = "GET",
                    path = "/status/200",
                    headers = {["Host"] = "test2.com"}
                }))
                assert.res_status(403, res)
            end)

            it("/status/500 return 403", function()
                local res = assert(proxy_client:send({
                    method = "GET",
                    path = "/status/500",
                    headers = {["Host"] = "test2.com"}
                }))
                assert.res_status(403, res)
            end)

            it("/request return 200", function()
                local res = assert(proxy_client:send({
                    method = "GET",
                    path = "/request",
                    headers = {["Host"] = "test2.com"}
                }))
                assert.res_status(200, res)
            end)
        end)

        describe("Regex Path Block", function()
            it("/status/200 return 403", function()
                local res = assert(proxy_client:send({
                    method = "GET",
                    path = "/status/200",
                    headers = {["Host"] = "test3.com"}
                }))
                assert.res_status(403, res)
            end)

            it("/status/500 return 403", function()
                local res = assert(proxy_client:send({
                    method = "GET",
                    path = "/status/500",
                    headers = {["Host"] = "test3.com"}
                }))
                assert.res_status(403, res)
            end)

            it("/request return 403", function()
                local res = assert(proxy_client:send({
                    method = "GET",
                    path = "/request",
                    headers = {["Host"] = "test3.com"}
                }))
                assert.res_status(403, res)
            end)
        end)
    end)
end
