diff --git a/app/views/entries/_results.html.erb b/app/views/entries/_results.html.erb
index b360922..e4fcea3 100644
--- a/app/views/entries/_results.html.erb
+++ b/app/views/entries/_results.html.erb
@@ -86,7 +86,7 @@
-
<%= pagy_info(@pagy) %>
+
<%= pagy_info(@pagy).html_safe %>
<%
pagination_params = { q: @query.presence, category: @category.presence, language: @language_code.presence, starts_with: @starts_with.presence }.compact
diff --git a/test/integration/cors_preflight_test.rb b/test/integration/cors_preflight_test.rb
new file mode 100644
index 0000000..9921728
--- /dev/null
+++ b/test/integration/cors_preflight_test.rb
@@ -0,0 +1,30 @@
+require "test_helper"
+
+class CorsPreflightTest < ActionDispatch::IntegrationTest
+ setup do
+ @origin = "http://localhost:5173"
+ @app_id = "app.sanasto"
+ end
+
+ test "options preflight returns cors headers when app header is requested" do
+ options "/api/entries", headers: {
+ "Origin" => @origin,
+ "Access-Control-Request-Method" => "GET",
+ "Access-Control-Request-Headers" => "x-sanasto-app"
+ }
+
+ assert_response :no_content
+ assert_equal @origin, response.headers["Access-Control-Allow-Origin"]
+ assert_includes response.headers["Access-Control-Allow-Headers"], "x-sanasto-app"
+ end
+
+ test "get includes cors headers when app id is provided" do
+ get "/api/entries", headers: {
+ "Origin" => @origin,
+ "X-Sanasto-App" => @app_id
+ }
+
+ assert_response :success
+ assert_equal @origin, response.headers["Access-Control-Allow-Origin"]
+ end
+end
diff --git a/test/middleware/sanasto_cors_test.rb b/test/middleware/sanasto_cors_test.rb
new file mode 100644
index 0000000..922026e
--- /dev/null
+++ b/test/middleware/sanasto_cors_test.rb
@@ -0,0 +1,55 @@
+require "test_helper"
+
+class SanastoCorsTest < ActiveSupport::TestCase
+ def setup
+ @app = ->(_env) { [ 200, {}, [ "ok" ] ] }
+ @middleware = Middleware::SanastoCors.new(@app)
+ @origin = "http://localhost:5173"
+ @app_id = "app.sanasto"
+ end
+
+ test "adds cors headers for allowed get requests" do
+ env = Rack::MockRequest.env_for(
+ "/api/entries",
+ method: "GET",
+ "HTTP_ORIGIN" => @origin,
+ "HTTP_X_SANASTO_APP" => @app_id
+ )
+
+ status, headers, _body = @middleware.call(env)
+
+ assert_equal 200, status
+ assert_equal @origin, headers["Access-Control-Allow-Origin"]
+ assert_includes headers["Access-Control-Allow-Headers"], "X-Sanasto-App"
+ end
+
+ test "returns preflight response with cors headers when app header is requested" do
+ env = Rack::MockRequest.env_for(
+ "/api/entries",
+ method: "OPTIONS",
+ "HTTP_ORIGIN" => @origin,
+ "HTTP_ACCESS_CONTROL_REQUEST_METHOD" => "GET",
+ "HTTP_ACCESS_CONTROL_REQUEST_HEADERS" => "x-sanasto-app"
+ )
+
+ status, headers, _body = @middleware.call(env)
+
+ assert_equal 204, status
+ assert_equal @origin, headers["Access-Control-Allow-Origin"]
+ assert_includes headers["Access-Control-Allow-Headers"], "x-sanasto-app"
+ assert_includes headers["Vary"], "Access-Control-Request-Headers"
+ end
+
+ test "does not add cors headers when app id is missing" do
+ env = Rack::MockRequest.env_for(
+ "/api/entries",
+ method: "GET",
+ "HTTP_ORIGIN" => @origin
+ )
+
+ status, headers, _body = @middleware.call(env)
+
+ assert_equal 200, status
+ assert_nil headers["Access-Control-Allow-Origin"]
+ end
+end