# frozen_string_literal: true

require 'test_helper'

module ActiveModelSerializers
  module Adapter
    class JsonApi < Base
      class ErrorsTest < Minitest::Test
        include ActiveModel::Serializer::Lint::Tests

        def setup
          @resource = ModelWithErrors.new
        end

        def test_active_model_with_error
          options = {
            serializer: ActiveModel::Serializer::ErrorSerializer,
            adapter: :json_api
          }

          @resource.errors.add(:name, 'cannot be nil')

          serializable_resource = ActiveModelSerializers::SerializableResource.new(@resource, options)
          assert_equal serializable_resource.serializer_instance.attributes, {}
          assert_equal serializable_resource.serializer_instance.object, @resource

          expected_errors_object = {
            errors: [
              {
                source: { pointer: '/data/attributes/name' },
                detail: 'cannot be nil'
              }
            ]
          }
          assert_equal serializable_resource.as_json, expected_errors_object
        end

        def test_active_model_with_multiple_errors
          options = {
            serializer: ActiveModel::Serializer::ErrorSerializer,
            adapter: :json_api
          }

          @resource.errors.add(:name, 'cannot be nil')
          @resource.errors.add(:name, 'must be longer')
          @resource.errors.add(:id, 'must be a uuid')

          serializable_resource = ActiveModelSerializers::SerializableResource.new(@resource, options)
          assert_equal serializable_resource.serializer_instance.attributes, {}
          assert_equal serializable_resource.serializer_instance.object, @resource

          expected_errors_object = {
            errors: [
              { source: { pointer: '/data/attributes/name' }, detail: 'cannot be nil' },
              { source: { pointer: '/data/attributes/name' }, detail: 'must be longer' },
              { source: { pointer: '/data/attributes/id' }, detail: 'must be a uuid' }
            ]
          }
          assert_equal serializable_resource.as_json, expected_errors_object
        end

        # see http://jsonapi.org/examples/
        def test_parameter_source_type_error
          parameter = 'auther'
          error_source = ActiveModelSerializers::Adapter::JsonApi::Error.error_source(:parameter, parameter)
          assert_equal({ parameter: parameter }, error_source)
        end

        def test_unknown_source_type_error
          value = 'auther'
          assert_raises(ActiveModelSerializers::Adapter::JsonApi::Error::UnknownSourceTypeError) do
            ActiveModelSerializers::Adapter::JsonApi::Error.error_source(:hyper, value)
          end
        end
      end
    end
  end
end
