1+ # frozen_string_literal: true
2+
3+ require "test_helper"
4+
5+ # Stub helper_method for non-Rails controller context
6+ module Kernel
7+ def helper_method ( *) ; end
8+ end
9+
10+ module ApiKeys
11+ class TenantResolutionConcernTest < ApiKeys ::Test
12+ class FakeRequest
13+ def uuid ; SecureRandom . uuid ; end
14+ end
15+
16+ class FakeController
17+ include ApiKeys ::Authentication
18+ include ApiKeys ::TenantResolution
19+
20+ def initialize ( api_key )
21+ @api_key = api_key
22+ end
23+
24+ # Minimal request needed for Authentication callbacks
25+ def request
26+ @request ||= FakeRequest . new
27+ end
28+
29+ # Override authenticator usage to set current_api_key directly for isolation
30+ def set_key ( api_key )
31+ @current_api_key = api_key
32+ end
33+
34+ # Satisfy render from Authentication even if not used here
35+ def render ( json :, status :) ; end
36+ end
37+
38+ def setup
39+ super
40+ ApiKeys . configure do |c |
41+ c . enable_async_operations = false
42+ c . tenant_resolver = -> ( api_key ) { api_key . owner if api_key . respond_to? ( :owner ) }
43+ end
44+ end
45+
46+ test "returns owner by default resolver" do
47+ user = User . create! ( name : "Tenant User" )
48+ key = ApiKeys ::ApiKey . create! ( owner : user , name : "TKey" )
49+
50+ controller = FakeController . new ( key )
51+ controller . set_key ( key )
52+
53+ assert_equal user , controller . send ( :current_api_tenant )
54+ assert_equal user , controller . send ( :current_api_key_tenant )
55+ assert_equal user , controller . send ( :current_api_account )
56+ assert_equal user , controller . send ( :current_api_owner )
57+ assert_equal user , controller . send ( :current_api_key_owner )
58+ end
59+
60+ test "returns custom tenant via resolver" do
61+ org = Struct . new ( :id ) . new ( 42 )
62+ user = User . create! ( name : "Org User" )
63+ key = ApiKeys ::ApiKey . create! ( owner : user , name : "Key" )
64+
65+ ApiKeys . configure { |c | c . tenant_resolver = -> ( api_key ) { org } }
66+ controller = FakeController . new ( key )
67+ controller . set_key ( key )
68+
69+ assert_equal org , controller . send ( :current_api_tenant )
70+ end
71+
72+ test "handles resolver errors and returns nil" do
73+ user = User . create! ( name : "Err User" )
74+ key = ApiKeys ::ApiKey . create! ( owner : user , name : "Key" )
75+
76+ ApiKeys . configure { |c | c . tenant_resolver = -> ( _ ) { raise "boom" } }
77+ controller = FakeController . new ( key )
78+ controller . set_key ( key )
79+
80+ assert_nil controller . send ( :current_api_tenant )
81+ end
82+
83+ test "returns nil when no current_api_key" do
84+ controller = FakeController . new ( nil )
85+ controller . set_key ( nil )
86+ assert_nil controller . send ( :current_api_tenant )
87+ end
88+ end
89+ end
0 commit comments