Fix conference serializer spec to work with MySQL

This commit is contained in:
Hernan Schmidt 2016-08-18 16:21:09 +02:00 committed by Hernán Schmidt
parent 9eb4ac2738
commit 4d6868d9bb
5 changed files with 125 additions and 73 deletions

View file

@ -227,6 +227,8 @@ group :test do
gem 'webmock' gem 'webmock'
# for mocking Stripe responses in tests # for mocking Stripe responses in tests
gem 'stripe-ruby-mock' gem 'stripe-ruby-mock'
# For validating JSON schemas
gem 'json-schema'
end end
group :development, :test do group :development, :test do

View file

@ -230,6 +230,8 @@ GEM
jquery-ui-rails (4.2.1) jquery-ui-rails (4.2.1)
railties (>= 3.2.16) railties (>= 3.2.16)
json (1.8.3) json (1.8.3)
json-schema (2.5.0)
addressable (~> 2.3)
jwt (1.0.0) jwt (1.0.0)
launchy (2.4.2) launchy (2.4.2)
addressable (~> 2.3) addressable (~> 2.3)
@ -577,6 +579,7 @@ DEPENDENCIES
jquery-datatables-rails (~> 2.2.1) jquery-datatables-rails (~> 2.2.1)
jquery-rails jquery-rails
jquery-ui-rails (~> 4.2.1) jquery-ui-rails (~> 4.2.1)
json-schema
leaflet-rails leaflet-rails
letter_opener letter_opener
letter_opener_web letter_opener_web

View file

@ -1,4 +1,5 @@
require 'spec_helper' require 'spec_helper'
describe ConferenceSerializer, type: :serializer do describe ConferenceSerializer, type: :serializer do
let(:conference) do let(:conference) do
create(:conference, short_title: 'goto', create(:conference, short_title: 'goto',
@ -8,84 +9,20 @@ describe ConferenceSerializer, type: :serializer do
end end
let(:serializer) { ConferenceSerializer.new(conference) } let(:serializer) { ConferenceSerializer.new(conference) }
let(:expected_hash) do
{
conference: {
short_title: 'goto',
title: conference.title,
description: 'Lorem ipsum dolor sit',
start_date: '2014-03-04',
end_date: '2014-03-10',
picture_url: nil,
difficulty_levels:
[{id: 1,
title: 'Easy',
description: 'Events are understandable for everyone without knowledge of the topic.'
},
{id: 2,
title: 'Medium',
description: 'Events require a basic understanding of the topic.'
},
{id: 3,
title: 'Hard',
description: 'Events require expert knowledge of the topic.'
}
],
event_types:
[{id: 1,
title: 'Talk',
length: 30,
description: 'Presentation in lecture format'
},
{id: 2,
title: 'Workshop',
length: 60,
description: 'Interactive hands-on practice'
}
],
rooms: [],
tracks: [],
date_range: 'March 04 - 10',
revision: 1
}
}
end
context 'conference does not have rooms and tracks' do context 'when the conference does not have rooms and tracks' do
it 'sets conference attributes with empty room and tracks' do it 'correctly serializes the conference' do
expect(serializer.to_json).to eq expected_hash.to_json expect(serializer.to_json).to match_response_schema('conference')
end end
end end
context 'conference has rooms and tracks' do context 'when the conference has rooms and tracks' do
before do let(:venue) { create(:venue, conference: conference) }
venue = create(:venue, conference: conference) let!(:room) { create(:room, venue: venue) }
_room = create(:room, venue: venue) let!(:track) { create(:track, program: conference.program) }
track = create(:track, program: conference.program)
room_hash = { it 'correctly serializes the conference' do
rooms: [{ expect(serializer.to_json).to match_response_schema('conference')
id: 1,
size: 4,
events: []
}
]
}
track_hash = {
tracks: [{
id: 1,
name: track.name,
description: track.description
}
]
}
expected_hash[:conference].merge! room_hash
expected_hash[:conference].merge! track_hash
end
it 'sets conference attributes with rooms and tracks' do
expect(serializer.to_json).to eq expected_hash.to_json
end end
end end
end end

View file

@ -0,0 +1,9 @@
# Source: https://robots.thoughtbot.com/validating-json-schemas-with-an-rspec-matcher
RSpec::Matchers.define :match_response_schema do |schema|
match do |json|
schema_directory = "#{Dir.pwd}/spec/support/schemas"
schema_path = "#{schema_directory}/#{schema}.json"
JSON::Validator.validate!(schema_path, json, strict: true)
end
end

View file

@ -0,0 +1,101 @@
{
"type": "object",
"required": ["conference"],
"properties": {
"conference" : {
"type" : "object",
"required" : [
"short_title",
"title",
"description",
"start_date",
"end_date",
"picture_url",
"difficulty_levels",
"event_types",
"rooms",
"tracks",
"date_range",
"revision"
],
"properties" : {
"short_title": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"start_date": {
"type": "string", "format": "date"
},
"end_date": {
"type": "string", "format": "date"
},
"picture_url": {
"anyOf": [
{ "type": "string" },
{ "type": "null" }
]
},
"difficulty_levels": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "title", "description"],
"properties": {
"id": { "type": "integer" },
"title": { "type": "string" },
"description": { "type": "string" }
}
}
},
"event_types": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "title", "description", "length"],
"properties": {
"id": { "type": "integer" },
"title": { "type": "string" },
"description": { "type": "string" },
"length": { "type": "integer" }
}
}
},
"rooms": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "size", "events"],
"properties": {
"id": { "type": "integer" },
"size": { "type": "integer" },
"events": { "type": "array" }
}
}
},
"tracks": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "name", "description"],
"properties": {
"id": { "type": "integer" },
"name": { "type": "string" },
"description": { "type": "string" }
}
}
},
"date_range": {
"type": "string"
},
"revision": {
"type": "integer"
}
}
}
}
}