Fix conference serializer spec to work with MySQL
This commit is contained in:
parent
9eb4ac2738
commit
4d6868d9bb
5 changed files with 125 additions and 73 deletions
2
Gemfile
2
Gemfile
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
9
spec/support/api_schema_matcher.rb
Normal file
9
spec/support/api_schema_matcher.rb
Normal 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
|
||||||
101
spec/support/schemas/conference.json
Normal file
101
spec/support/schemas/conference.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue