mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
24a864437e
* Add ActiveSupport::CurrentAttributes to provide a thread-isolated attributes singleton * Need to require first * Move stubs into test namespace. Thus they won't conflict with other Current and Person stubs. * End of the line for you, whitespace! * Support super in attribute methods. Define instance level accessors in an included module such that `super` in an overriden accessor works, akin to Active Model. * Spare users the manual require. Follow the example of concerns, autoload in the top level Active Support file. * Add bidelegation support * Rename #expose to #set. Simpler, clearer * Automatically reset every instance. Skips the need for users to actively embed something that resets their CurrentAttributes instances. * Fix test name; add tangible name value when blank. * Try to ensure we run after a request as well. * Delegate all missing methods to the instance This allows regular `delegate` to serve, so we don't need bidelegate. * Properly test resetting after execution cycle. Also remove the stale puts debugging. * Update documentation to match new autoreset
96 lines
2.5 KiB
Ruby
96 lines
2.5 KiB
Ruby
require "abstract_unit"
|
|
|
|
class CurrentAttributesTest < ActiveSupport::TestCase
|
|
Person = Struct.new(:name, :time_zone)
|
|
|
|
class Current < ActiveSupport::CurrentAttributes
|
|
attribute :world, :account, :person, :request
|
|
delegate :time_zone, to: :person
|
|
|
|
resets { Time.zone = "UTC" }
|
|
|
|
def account=(account)
|
|
super
|
|
self.person = "#{account}'s person"
|
|
end
|
|
|
|
def person=(person)
|
|
super
|
|
Time.zone = person.try(:time_zone)
|
|
end
|
|
|
|
def request
|
|
"#{super} something"
|
|
end
|
|
|
|
def intro
|
|
"#{person.name}, in #{time_zone}"
|
|
end
|
|
end
|
|
|
|
setup { Current.reset }
|
|
|
|
test "read and write attribute" do
|
|
Current.world = "world/1"
|
|
assert_equal "world/1", Current.world
|
|
end
|
|
|
|
test "read overwritten attribute method" do
|
|
Current.request = "request/1"
|
|
assert_equal "request/1 something", Current.request
|
|
end
|
|
|
|
test "set attribute via overwritten method" do
|
|
Current.account = "account/1"
|
|
assert_equal "account/1", Current.account
|
|
assert_equal "account/1's person", Current.person
|
|
end
|
|
|
|
test "set auxiliary class via overwritten method" do
|
|
Current.person = Person.new("David", "Central Time (US & Canada)")
|
|
assert_equal "Central Time (US & Canada)", Time.zone.name
|
|
end
|
|
|
|
test "resets auxiliary class via callback" do
|
|
Current.person = Person.new("David", "Central Time (US & Canada)")
|
|
assert_equal "Central Time (US & Canada)", Time.zone.name
|
|
|
|
Current.reset
|
|
assert_equal "UTC", Time.zone.name
|
|
end
|
|
|
|
test "set attribute only via scope" do
|
|
Current.world = "world/1"
|
|
|
|
Current.set(world: "world/2") do
|
|
assert_equal "world/2", Current.world
|
|
end
|
|
|
|
assert_equal "world/1", Current.world
|
|
end
|
|
|
|
test "set multiple attributes" do
|
|
Current.world = "world/1"
|
|
Current.account = "account/1"
|
|
|
|
Current.set(world: "world/2", account: "account/2") do
|
|
assert_equal "world/2", Current.world
|
|
assert_equal "account/2", Current.account
|
|
end
|
|
|
|
assert_equal "world/1", Current.world
|
|
assert_equal "account/1", Current.account
|
|
end
|
|
|
|
test "delegation" do
|
|
Current.person = Person.new("David", "Central Time (US & Canada)")
|
|
assert_equal "Central Time (US & Canada)", Current.time_zone
|
|
assert_equal "Central Time (US & Canada)", Current.instance.time_zone
|
|
end
|
|
|
|
test "all methods forward to the instance" do
|
|
Current.person = Person.new("David", "Central Time (US & Canada)")
|
|
assert_equal "David, in Central Time (US & Canada)", Current.intro
|
|
assert_equal "David, in Central Time (US & Canada)", Current.instance.intro
|
|
end
|
|
end
|