;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC Sucursal en España SL

(ns backend-tests.http-middleware-security
  (:require
   [app.http.security :as sec]
   [clojure.test :as t]
   [yetti.request :as yreq]
   [yetti.response :as yres]))

(defn- mock-request
  [method value]
  (reify yreq/IRequest
    (method [_]
      method)
    (get-header [_ _]
      value)))

(t/deftest sec-fetch-metadata
  (let [request1 (mock-request :get "same-origin")
        request2 (mock-request :post "same-origin")
        request3 (mock-request :get "same-site")
        request4 (mock-request :post "same-site")
        request5 (mock-request :get "cross-site")
        request6 (mock-request :post "cross-site")

        handler  (fn [request]
                   {::yres/status 200})
        handler  (#'sec/wrap-sec-fetch-metadata handler)
        resp1    (handler request1)
        resp2    (handler request2)
        resp3    (handler request3)
        resp4    (handler request4)
        resp5    (handler request5)
        resp6    (handler request6)]

    (t/is (= 200 (::yres/status resp1)))
    (t/is (= 200 (::yres/status resp2)))
    (t/is (= 200 (::yres/status resp3)))
    (t/is (= 403 (::yres/status resp4)))
    (t/is (= 200 (::yres/status resp5)))
    (t/is (= 403 (::yres/status resp6)))))

(t/deftest client-header-check
  (let [request1 (mock-request :get "some")
        request2 (mock-request :post nil)

        handler  (fn [request]
                   {::yres/status 200})
        handler  (#'sec/wrap-client-header-check handler)
        resp1    (handler request1)
        resp2    (handler request2)]

    (t/is (= 200 (::yres/status resp1)))
    (t/is (= 403 (::yres/status resp2)))))

