File: read_attribute_for_serialization_test.rb

package info (click to toggle)
ruby-active-model-serializers 0.10.12-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,752 kB
  • sloc: ruby: 13,138; sh: 53; makefile: 6
file content (81 lines) | stat: -rw-r--r-- 2,885 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
# frozen_string_literal: true

require 'test_helper'

module ActiveModel
  class Serializer
    class ReadAttributeForSerializationTest < ActiveSupport::TestCase
      # https://github.com/rails-api/active_model_serializers/issues/1653
      class Parent < ActiveModelSerializers::Model
        attributes :id
      end
      class Child < Parent
        attributes :name
      end
      class ParentSerializer < ActiveModel::Serializer
        attributes :$id

        define_method(:$id) do
          object.id
        end
      end
      class ChildSerializer < ParentSerializer
        attributes :name
      end

      def test_child_serializer_calls_dynamic_method_in_parent_serializer
        parent = ParentSerializer.new(Parent.new(id: 5))
        child  = ChildSerializer.new(Child.new(id: 6, name: 'Child'))
        assert_equal 5, parent.read_attribute_for_serialization(:$id)
        assert_equal 6, child.read_attribute_for_serialization(:$id)
      end

      # https://github.com/rails-api/active_model_serializers/issues/1658
      class ErrorResponse < ActiveModelSerializers::Model
        attributes :error
      end
      class ApplicationSerializer < ActiveModel::Serializer
        attributes :status

        def status
          object.try(:errors).blank? && object.try(:error).blank?
        end
      end
      class ErrorResponseSerializer < ApplicationSerializer
        attributes :error
      end
      class ErrorResponseWithSuperSerializer < ApplicationSerializer
        attributes :error

        def success
          super
        end
      end

      def test_child_serializer_with_error_attribute
        error = ErrorResponse.new(error: 'i have an error')
        serializer = ErrorResponseSerializer.new(error)
        serializer_with_super = ErrorResponseWithSuperSerializer.new(error)
        assert_equal false, serializer.read_attribute_for_serialization(:status)
        assert_equal false, serializer_with_super.read_attribute_for_serialization(:status)
      end

      def test_child_serializer_with_errors
        error = ErrorResponse.new
        error.errors.add(:invalid, 'i am not valid')
        serializer = ErrorResponseSerializer.new(error)
        serializer_with_super = ErrorResponseWithSuperSerializer.new(error)
        assert_equal false, serializer.read_attribute_for_serialization(:status)
        assert_equal false, serializer_with_super.read_attribute_for_serialization(:status)
      end

      def test_child_serializer_no_error_attribute_or_errors
        error = ErrorResponse.new
        serializer = ErrorResponseSerializer.new(error)
        serializer_with_super = ErrorResponseWithSuperSerializer.new(error)
        assert_equal true, serializer.read_attribute_for_serialization(:status)
        assert_equal true, serializer_with_super.read_attribute_for_serialization(:status)
      end
    end
  end
end