File: adapter_for_test.rb

package info (click to toggle)
ruby-active-model-serializers 0.10.10-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,704 kB
  • sloc: ruby: 13,103; sh: 53; makefile: 10
file content (210 lines) | stat: -rw-r--r-- 7,986 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# frozen_string_literal: true

require 'test_helper'

module ActiveModelSerializers
  class AdapterForTest < ::ActiveSupport::TestCase
    UnknownAdapterError = ::ActiveModelSerializers::Adapter::UnknownAdapterError

    def test_serializer_adapter_returns_configured_adapter
      assert_output(nil, /ActiveModelSerializers::Adapter.configured_adapter/) do
        assert_equal ActiveModelSerializers::Adapter.configured_adapter, ActiveModel::Serializer.adapter
      end
    end

    def test_returns_default_adapter
      with_adapter_config_setup do
        adapter = ActiveModelSerializers::Adapter.configured_adapter
        assert_equal ActiveModelSerializers::Adapter::Attributes, adapter
      end
    end

    def test_overwrite_adapter_with_symbol
      with_adapter_config_setup do
        ActiveModelSerializers.config.adapter = :null

        adapter = ActiveModelSerializers::Adapter.configured_adapter
        assert_equal ActiveModelSerializers::Adapter::Null, adapter
      end
    end

    def test_overwrite_adapter_with_camelcased_symbol
      with_adapter_config_setup do
        ActiveModelSerializers.config.adapter = :JsonApi

        adapter = ActiveModelSerializers::Adapter.configured_adapter
        assert_equal ActiveModelSerializers::Adapter::JsonApi, adapter
      end
    end

    def test_overwrite_adapter_with_string
      with_adapter_config_setup do
        ActiveModelSerializers.config.adapter = 'json_api'

        adapter = ActiveModelSerializers::Adapter.configured_adapter
        assert_equal ActiveModelSerializers::Adapter::JsonApi, adapter
      end
    end

    def test_overwrite_adapter_with_a_camelcased_string
      with_adapter_config_setup do
        ActiveModelSerializers.config.adapter = 'JsonApi'

        adapter = ActiveModelSerializers::Adapter.configured_adapter
        assert_equal ActiveModelSerializers::Adapter::JsonApi, adapter
      end
    end

    def test_overwrite_adapter_with_class
      with_adapter_config_setup do
        ActiveModelSerializers.config.adapter = ActiveModelSerializers::Adapter::Null

        adapter = ActiveModelSerializers::Adapter.configured_adapter
        assert_equal ActiveModelSerializers::Adapter::Null, adapter
      end
    end

    def test_raises_exception_if_invalid_symbol_given
      with_adapter_config_setup do
        ActiveModelSerializers.config.adapter = :unknown

        assert_raises ActiveModelSerializers::Adapter::UnknownAdapterError do
          ActiveModelSerializers::Adapter.configured_adapter
        end
      end
    end

    def test_raises_exception_if_it_does_not_know_hot_to_infer_adapter
      with_adapter_config_setup do
        ActiveModelSerializers.config.adapter = 42

        assert_raises ActiveModelSerializers::Adapter::UnknownAdapterError do
          ActiveModelSerializers::Adapter.configured_adapter
        end
      end
    end

    def test_adapter_class_for_known_adapter
      klass = ActiveModelSerializers::Adapter.adapter_class(:json_api)
      assert_equal ActiveModelSerializers::Adapter::JsonApi, klass
    end

    def test_adapter_class_for_unknown_adapter
      assert_raises ActiveModelSerializers::Adapter::UnknownAdapterError do
        ActiveModelSerializers::Adapter.adapter_class(:json_simple)
      end
    end

    def test_adapter_map
      expected_adapter_map = {
        'null'.freeze              => ActiveModelSerializers::Adapter::Null,
        'json'.freeze              => ActiveModelSerializers::Adapter::Json,
        'attributes'.freeze => ActiveModelSerializers::Adapter::Attributes,
        'json_api'.freeze => ActiveModelSerializers::Adapter::JsonApi
      }
      actual = ActiveModelSerializers::Adapter.adapter_map
      assert_equal actual, expected_adapter_map
    end

    def test_adapters
      assert_equal ActiveModelSerializers::Adapter.adapters.sort, [
        'attributes'.freeze,
        'json'.freeze,
        'json_api'.freeze,
        'null'.freeze
      ]
    end

    def test_lookup_adapter_by_string_name
      assert_equal ActiveModelSerializers::Adapter.lookup('json'.freeze), ActiveModelSerializers::Adapter::Json
    end

    def test_lookup_adapter_by_symbol_name
      assert_equal ActiveModelSerializers::Adapter.lookup(:json), ActiveModelSerializers::Adapter::Json
    end

    def test_lookup_adapter_by_class
      klass = ActiveModelSerializers::Adapter::Json
      assert_equal ActiveModelSerializers::Adapter.lookup(klass), klass
    end

    def test_lookup_adapter_from_environment_registers_adapter
      ActiveModelSerializers::Adapter.const_set(:AdapterFromEnvironment, Class.new)
      klass = ::ActiveModelSerializers::Adapter::AdapterFromEnvironment
      name = 'adapter_from_environment'.freeze
      assert_equal ActiveModelSerializers::Adapter.lookup(name), klass
      assert ActiveModelSerializers::Adapter.adapters.include?(name)
    ensure
      ActiveModelSerializers::Adapter.adapter_map.delete(name)
      ActiveModelSerializers::Adapter.send(:remove_const, :AdapterFromEnvironment)
    end

    def test_lookup_adapter_for_unknown_name
      assert_raises ActiveModelSerializers::Adapter::UnknownAdapterError do
        ActiveModelSerializers::Adapter.lookup(:json_simple)
      end
    end

    def test_adapter
      assert_equal ActiveModelSerializers.config.adapter, :attributes
      assert_equal ActiveModelSerializers::Adapter.configured_adapter, ActiveModelSerializers::Adapter::Attributes
    end

    def test_register_adapter
      new_adapter_name  = :foo
      new_adapter_klass = Class.new
      ActiveModelSerializers::Adapter.register(new_adapter_name, new_adapter_klass)
      assert ActiveModelSerializers::Adapter.adapters.include?('foo'.freeze)
      assert ActiveModelSerializers::Adapter.lookup(:foo), new_adapter_klass
    ensure
      ActiveModelSerializers::Adapter.adapter_map.delete(new_adapter_name.to_s)
    end

    def test_inherited_adapter_hooks_register_adapter
      Object.const_set(:MyAdapter, Class.new)
      my_adapter = MyAdapter
      ActiveModelSerializers::Adapter::Base.inherited(my_adapter)
      assert_equal ActiveModelSerializers::Adapter.lookup(:my_adapter), my_adapter
    ensure
      ActiveModelSerializers::Adapter.adapter_map.delete('my_adapter'.freeze)
      Object.send(:remove_const, :MyAdapter)
    end

    def test_inherited_adapter_hooks_register_namespaced_adapter
      Object.const_set(:MyNamespace, Module.new)
      MyNamespace.const_set(:MyAdapter, Class.new)
      my_adapter = MyNamespace::MyAdapter
      ActiveModelSerializers::Adapter::Base.inherited(my_adapter)
      assert_equal ActiveModelSerializers::Adapter.lookup(:'my_namespace/my_adapter'), my_adapter
    ensure
      ActiveModelSerializers::Adapter.adapter_map.delete('my_namespace/my_adapter'.freeze)
      MyNamespace.send(:remove_const, :MyAdapter)
      Object.send(:remove_const, :MyNamespace)
    end

    def test_inherited_adapter_hooks_register_subclass_of_registered_adapter
      Object.const_set(:MyAdapter, Class.new)
      my_adapter = MyAdapter
      Object.const_set(:MySubclassedAdapter, Class.new(MyAdapter))
      my_subclassed_adapter = MySubclassedAdapter
      ActiveModelSerializers::Adapter::Base.inherited(my_adapter)
      ActiveModelSerializers::Adapter::Base.inherited(my_subclassed_adapter)
      assert_equal ActiveModelSerializers::Adapter.lookup(:my_adapter), my_adapter
      assert_equal ActiveModelSerializers::Adapter.lookup(:my_subclassed_adapter), my_subclassed_adapter
    ensure
      ActiveModelSerializers::Adapter.adapter_map.delete('my_adapter'.freeze)
      ActiveModelSerializers::Adapter.adapter_map.delete('my_subclassed_adapter'.freeze)
      Object.send(:remove_const, :MyAdapter)
      Object.send(:remove_const, :MySubclassedAdapter)
    end

    private

    def with_adapter_config_setup
      previous_adapter = ActiveModelSerializers.config.adapter
      yield
    ensure
      ActiveModelSerializers.config.adapter = previous_adapter
    end
  end
end