defmodule ToweropsWeb.Plugs.SecurityHeadersTest do use ToweropsWeb.ConnCase, async: true alias ToweropsWeb.Plugs.SecurityHeaders describe "call/2" do test "adds security headers in production environment" do # Save original env original_env = Application.get_env(:towerops, :env) try do # Set environment to production Application.put_env(:towerops, :env, :prod) conn = SecurityHeaders.call(build_conn(), []) # Verify all security headers are present assert ["default-src 'self'" <> _] = get_resp_header(conn, "content-security-policy") assert ["SAMEORIGIN"] = get_resp_header(conn, "x-frame-options") assert ["nosniff"] = get_resp_header(conn, "x-content-type-options") assert ["strict-origin-when-cross-origin"] = get_resp_header(conn, "referrer-policy") # Verify CSP contains required directives [csp] = get_resp_header(conn, "content-security-policy") assert csp =~ "default-src 'self'" assert csp =~ "script-src 'self' 'unsafe-inline' 'unsafe-eval'" assert csp =~ "style-src 'self' 'unsafe-inline' 'unsafe-hashes'" assert csp =~ "img-src 'self' data: https:" assert csp =~ "font-src 'self' data:" assert csp =~ "connect-src 'self' ws: wss:" assert csp =~ "frame-ancestors 'self'" after # Restore original env Application.put_env(:towerops, :env, original_env) end end test "does not add security headers in non-production environment" do # Default test environment is :test, not :prod conn = SecurityHeaders.call(build_conn(), []) # Verify no security headers are present assert [] = get_resp_header(conn, "content-security-policy") assert [] = get_resp_header(conn, "x-frame-options") assert [] = get_resp_header(conn, "x-content-type-options") assert [] = get_resp_header(conn, "referrer-policy") end test "does not add security headers in development environment" do # Save original env original_env = Application.get_env(:towerops, :env) try do # Set environment to development Application.put_env(:towerops, :env, :dev) conn = SecurityHeaders.call(build_conn(), []) # Verify no security headers are present assert [] = get_resp_header(conn, "content-security-policy") assert [] = get_resp_header(conn, "x-frame-options") assert [] = get_resp_header(conn, "x-content-type-options") assert [] = get_resp_header(conn, "referrer-policy") after # Restore original env Application.put_env(:towerops, :env, original_env) end end end end