const std = @import("std");
const clock = @import("../core/clock.zig");
const auth = @import("../auth/tokens.zig");
const dpop = @import("../internal/dpop.zig");
const log = @import("../core/log.zig");
const store = @import("../storage/store.zig");
const httpz = @import("httpz");
const http = std.http;
pub const Request = httpz.Request;
pub const Response = httpz.Response;
/// The exact bodies of a page's inline `");
try std.testing.expectEqual(2, code.scripts.len);
try std.testing.expectEqual(1, code.styles.len);
const csp = htmlSecurityHeaders(code)[0].value;
try std.testing.expect(std.mem.indexOf(u8, csp, "script-src 'sha256-bhHHL3z2vDgxUt0W3dWQOrprscmda2Y5pLsLg4GF+pI=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=';") != null);
try std.testing.expect(std.mem.indexOf(u8, csp, "unsafe") == null);
try std.testing.expect(std.mem.indexOf(u8, htmlSecurityHeaders(.{})[0].value, "script-src 'none'; style-src 'none';") != null);
const dynamic = try htmlSecurityHeadersWithStyle(std.testing.allocator, .{ .styles = code.styles }, "");
defer std.testing.allocator.free(dynamic[0].value);
try std.testing.expect(std.mem.indexOf(u8, dynamic[0].value, "style-src 'sha256-" ++ comptime hashOf("p{}") ++ "' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU='; img-src") != null);
}
test "decodes query params" {
var buf: [64]u8 = undefined;
try std.testing.expectEqualStrings("did:plc:service", queryParam("/xrpc/foo?aud=did%3Aplc%3Aservice", "aud", &buf).?);
}
test "formats OAuth invalid token challenges" {
var buf: [160]u8 = undefined;
try std.testing.expectEqualStrings(
"Bearer error=\"invalid_token\", error_description=\"Token has expired\"",
try formatInvalidTokenChallenge(&buf, .bearer, "Token has expired"),
);
try std.testing.expectEqualStrings(
"DPoP error=\"invalid_token\", error_description=\"Token has been revoked\"",
try formatInvalidTokenChallenge(&buf, .dpop, "Token has been revoked"),
);
}