Files
sure/test/api_endpoint_consistency_rule_test.rb
T
Juan José Mata 157daf5176 Consolidate repository instructions after auditing their history (#3409)
* Document instruction inventory and preservation decisions

Trace main history from September 2025 through September 2026, including earlier policy origins. Record preserved requirements, detailed-guide destinations, stale facts, harness boundaries and explicit policy-strength decisions before consolidating instruction sources.

* Consolidate repository instructions into shared guidance

Keep AGENTS concise and vendor neutral, move detailed conventions into shared guides, and use thin adapters with preserved Cursor scopes. Preserve the strict pre-PR checks globally and document the stronger scope, retired migration pin and rule-generation trigger. Update existing API guidance verification without changing application behavior.

* Narrow the always-on Cursor UI adapter and correct the SimpleFIN comment

Split the design-system guidance out of docs/llm-guides/ui.md into
docs/llm-guides/design-system.md. The ui-ux-design-guidelines rule is
alwaysApply: true, so importing all of ui.md loaded the Stimulus,
localization and ViewComponent guidance (previously confined to scoped
rules) on every Cursor session; the always-on adapter now imports only the
design-system guide, matching the scope it had before the consolidation.
view_conventions and stimulus_conventions keep the full UI guide.

Also correct the stale Provider::Simplefin header comment: pending
inclusion defaults on and is resolved by the importer (explicit argument,
then SIMPLEFIN_INCLUDE_PENDING, then Setting.syncs_include_pending); the
previous comment described the flag as default-off.

* Read guidance files as UTF-8 in the API consistency validators

The frontmatter regex match ran against content read with the locale
default external encoding; the Cursor rule's description contains an em
dash, so under US-ASCII (LC_ALL=C) Regexp#match raised ArgumentError,
breaking the standalone no-Rails fallback the docs point contributors to.
Read all checked files with an explicit UTF-8 encoding in both the
standalone script and the Rails test.
2026-09-06 07:14:43 +02:00

75 lines
2.9 KiB
Ruby

# frozen_string_literal: true
# Verifies the shared API checklist and its canonical/scoped entry points (issue #944).
# If Rails fails to load (e.g. Sidekiq::Throttled), run the standalone script instead:
# ruby test/support/verify_api_endpoint_consistency.rb
require "test_helper"
require "yaml"
class ApiEndpointConsistencyRuleTest < ActiveSupport::TestCase
RULE_PATH = ".cursor/rules/api-endpoint-consistency.mdc"
GUIDE_PATH = "docs/llm-guides/api-endpoint-consistency.md"
AGENTS_PATH = "AGENTS.md"
def root
@root ||= Rails.root
end
test "rule file exists" do
assert File.exist?(root.join(RULE_PATH)), "Expected #{RULE_PATH} to exist"
end
test "rule preserves exact API v1 applicability and imports shared guide" do
content = File.read(root.join(RULE_PATH), encoding: "UTF-8")
frontmatter = content.match(/\A---\r?\n(?<yaml>.*?)\r?\n---\r?\n(?<body>.*)\z/m)
assert frontmatter, "Expected frontmatter at the start of the rule"
keys = YAML.parse(frontmatter[:yaml]).root.children.each_slice(2).map { |key, _value| key.value }
assert_equal %w[alwaysApply description globs], keys.sort
metadata = YAML.safe_load(frontmatter[:yaml])
assert_equal false, metadata.fetch("alwaysApply")
assert_equal [
"app/controllers/api/v1/**/*.rb",
"spec/requests/api/v1/**/*.rb",
"test/controllers/api/v1/**/*.rb"
], metadata.fetch("globs").split(",").map(&:strip)
assert_equal "@#{GUIDE_PATH}", frontmatter[:body].strip
end
test "shared guide includes Minitest behavioral coverage section" do
content = File.read(root.join(GUIDE_PATH), encoding: "UTF-8")
assert_includes content, "Minitest behavioral coverage"
assert_includes content, "test/controllers/api/v1/{resource}_controller_test.rb"
assert_includes content, "api_headers"
assert_includes content, "X-Api-Key"
end
test "shared guide includes rswag docs-only section" do
content = File.read(root.join(GUIDE_PATH), encoding: "UTF-8")
assert_includes content, "rswag is docs-only"
assert_includes content, "expect"
assert_includes content, "assert_"
assert_includes content, "run_test!"
assert_includes content, "rswag:specs:swaggerize"
end
test "shared guide includes same API key auth section" do
content = File.read(root.join(GUIDE_PATH), encoding: "UTF-8")
assert_includes content, "Same API key auth"
assert_includes content, "ApiKey.generate_secure_key"
assert_includes content, "plain_key"
assert_includes content, "Doorkeeper"
end
test "AGENTS.md references post-commit API consistency" do
assert File.exist?(root.join(AGENTS_PATH)), "Expected #{AGENTS_PATH} to exist"
content = File.read(root.join(AGENTS_PATH), encoding: "UTF-8")
assert_includes content, "Post-commit API consistency"
assert_includes content, GUIDE_PATH
assert_includes content, "Minitest"
assert_includes content, "rswag"
assert_includes content, "X-Api-Key"
end
end