1

app/models/author.rb:

                class Author < ApplicationRecord
                  validates :name, presence: true,
                                   uniqueness: { case_sensitive: false }
                end

                

app/serializers/author_serializer.rb:

              class AuthorSerializer < ActiveModel::Serializer
                  attributes :id, :name, :bio
                end


           

spec/spec_helper.rb:

    #...

require 'json_matchers/rspec'
JsonMatchers.schema_root = 'spec/support/api/schemas.author.json':
 #...

spec/support/api/schemas/authors/show.json:

{
  "id": "file:/authors/show.json#",
  "type": "object",
  "definitions": {
    "authors": {
      "description": "A collection of authors",
      "example": [{ "id": "1", "name": "Name" }],
      "type": "array",
      "items": {
        "$ref": "file:/author.json#"
      }
    }
  },
  "required": ["authors"],
  "properties": {
    "authors": {
      "$ref": "#/definitions/authors"
    }
  }
}

spec/requests/authors_show_request_pec.rb:

    RSpec.describe 'Authors', type: :request do
      setup { host! 'api.example.com' }
    
      describe 'GET /author/:id' do
        let!(:author) { create(:author, id: 13, name: 'Name', bio: 'bio') }
        it 'returns requested author' do
          get author_path(13)
          expect(response).to have_http_status(200)
          author_from_response = JSON.parse(response.body)
          expect(author_from_response['name']).to eq(author.name)
          expect(author_from_response['bio']).to eq(author.bio)
          expect(response).to match_json_schema('author')
        end
  end

end

Response body contains all expected data, but spec if falinig to validate matching response to json schema. Json_matchers gem seems to be configured according to manual. Error that appears:

JsonMatchers::InvalidSchemaError:
       783: unexpected token at '}
       '
Anand Bait
  • 331
  • 1
  • 12

1 Answers1

1

Try removing the trailing commas. The ruby JSON parser does not like them. Your JSON response should be:

{
  "id": "file:/authors/index.json#",
  "type": "object",
  "definitions": {
    "authors": {
      "description": "A collection of authors",
      "example": [{ "id": "1", "name": "Name" }],
      "type": "array",
      "items": {
        "$ref": "file:/author.json#"
      }
    }
  },
  "required": ["authors"],
  "properties": {
    "authors": {
      "$ref": "#/definitions/authors"
    }
  }
}

Notice no trailing commas after the "items", "authors" nor "properties".

Kaom Te
  • 774
  • 1
  • 8
  • 17