roar 0.11.7 → 0.11.8
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +7 -0
- data/CHANGES.markdown +4 -0
- data/Rakefile +1 -1
- data/gemfiles/Gemfile.representable-1.3 +12 -0
- data/lib/roar/representer/json/hal.rb +6 -11
- data/lib/roar/version.rb +1 -1
- data/test/hal_json_test.rb +24 -25
- data/test/hal_links_test.rb +31 -0
- data/test/http_verbs_feature_test.rb +2 -1
- data/test/hypermedia_test.rb +11 -0
- data/test/test_helper.rb +9 -15
- metadata +4 -34
- data/test/dummy/Rakefile +0 -7
- data/test/dummy/app/controllers/albums_controller.rb +0 -27
- data/test/dummy/app/controllers/application_controller.rb +0 -4
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/models/album.rb +0 -6
- data/test/dummy/app/models/song.rb +0 -2
- data/test/dummy/app/representers/representer/xml/album.rb +0 -19
- data/test/dummy/app/representers/representer/xml/song.rb +0 -9
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -20
- data/test/dummy/config/boot.rb +0 -10
- data/test/dummy/config/database.yml +0 -22
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -16
- data/test/dummy/config/environments/production.rb +0 -46
- data/test/dummy/config/environments/test.rb +0 -32
- data/test/dummy/config/locales/en.yml +0 -5
- data/test/dummy/config/routes.rb +0 -7
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20110514114753_create_albums.rb +0 -14
- data/test/dummy/db/migrate/20110514121228_create_songs.rb +0 -14
- data/test/dummy/db/schema.rb +0 -29
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/public/404.html +0 -26
- data/test/dummy/public/422.html +0 -26
- data/test/dummy/public/500.html +0 -26
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +0 -6
- data/test/integration_test.rb +0 -85
- data/test/rails/controller_methods_test.rb +0 -147
- data/test/rails/rails_representer_methods_test.rb +0 -32
data/.travis.yml
CHANGED
data/CHANGES.markdown
CHANGED
data/Rakefile
CHANGED
@@ -7,6 +7,6 @@ task :default => [:test]
|
|
7
7
|
|
8
8
|
Rake::TestTask.new(:test) do |test|
|
9
9
|
test.libs << 'test'
|
10
|
-
test.test_files = FileList['test/*_test.rb']
|
10
|
+
test.test_files = FileList['test/*_test.rb']
|
11
11
|
test.verbose = true
|
12
12
|
end
|
@@ -48,11 +48,7 @@ module Roar::Representer
|
|
48
48
|
|
49
49
|
module ClassMethods
|
50
50
|
def links_definition_options
|
51
|
-
super.tap { |options| options[1].merge!(
|
52
|
-
:from => :_links,
|
53
|
-
:extend => HAL::Links::LinkCollectionRepresenter,
|
54
|
-
:instance => lambda { |hsh| LinkCollection.new(link_array_rels) }) # defined in InstanceMethods as this is executed in represented context.
|
55
|
-
}
|
51
|
+
super.tap { |options| options[1].merge!(:from => :_links) }
|
56
52
|
end
|
57
53
|
end
|
58
54
|
|
@@ -156,13 +152,12 @@ module Roar::Representer
|
|
156
152
|
|
157
153
|
|
158
154
|
module ClassMethods
|
159
|
-
# TODO: remove Links support in non-HAL.
|
160
155
|
def links_definition_options
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
156
|
+
[:links,
|
157
|
+
:from => :links,
|
158
|
+
:extend => HAL::Links::LinkCollectionRepresenter,
|
159
|
+
:instance => lambda { |hsh| LinkCollection.new(link_array_rels) } # defined in InstanceMethods as this is executed in represented context.
|
160
|
+
]
|
166
161
|
end
|
167
162
|
|
168
163
|
# Use this to define link arrays. It accepts the shared rel attribute and an array of options per link object.
|
data/lib/roar/version.rb
CHANGED
data/test/hal_json_test.rb
CHANGED
@@ -62,44 +62,43 @@ class HalJsonTest < MiniTest::Spec
|
|
62
62
|
|
63
63
|
|
64
64
|
describe "HAL/JSON" do
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
"http://items/#{value}"
|
71
|
-
end
|
65
|
+
Bla = Module.new do
|
66
|
+
include Roar::Representer::JSON::HAL
|
67
|
+
property :title
|
68
|
+
link :self do
|
69
|
+
"http://songs/#{title}"
|
72
70
|
end
|
71
|
+
end
|
73
72
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
"http://orders/#{id}"
|
80
|
-
end
|
73
|
+
representer_for([Roar::Representer::JSON::HAL]) do
|
74
|
+
property :id
|
75
|
+
collection :songs, :class => Song, :extend => Bla, :embedded => true
|
76
|
+
link :self do
|
77
|
+
"http://albums/#{id}"
|
81
78
|
end
|
79
|
+
end
|
82
80
|
|
83
|
-
|
81
|
+
before do
|
82
|
+
@album = Album.new(:songs => [Song.new(:title => "Beer")], :id => 1).extend(rpr)
|
84
83
|
end
|
85
84
|
|
86
85
|
it "render links and embedded resources according to HAL" do
|
87
|
-
assert_equal "{\"id\":1,\"_embedded\":{\"
|
86
|
+
assert_equal "{\"id\":1,\"_embedded\":{\"songs\":[{\"title\":\"Beer\",\"_links\":{\"self\":{\"href\":\"http://songs/Beer\"}}}]},\"_links\":{\"self\":{\"href\":\"http://albums/1\"}}}", @album.to_json
|
88
87
|
end
|
89
88
|
|
90
89
|
it "parses links and resources following the mighty HAL" do
|
91
|
-
@
|
92
|
-
assert_equal 2, @
|
93
|
-
assert_equal "Coffee", @
|
94
|
-
assert_equal "http://
|
95
|
-
assert_equal "http://
|
90
|
+
@album.from_json("{\"id\":2,\"_embedded\":{\"songs\":[{\"title\":\"Coffee\",\"_links\":{\"self\":{\"href\":\"http://songs/Coffee\"}}}]},\"_links\":{\"self\":{\"href\":\"http://albums/2\"}}}")
|
91
|
+
assert_equal 2, @album.id
|
92
|
+
assert_equal "Coffee", @album.songs.first.title
|
93
|
+
assert_equal "http://songs/Coffee", @album.songs.first.links[:self].href
|
94
|
+
assert_equal "http://albums/2", @album.links[:self].href
|
96
95
|
end
|
97
96
|
|
98
97
|
it "doesn't require _links and _embedded to be present" do
|
99
|
-
@
|
100
|
-
assert_equal 2, @
|
101
|
-
assert_equal [], @
|
102
|
-
@
|
98
|
+
@album.from_json("{\"id\":2}")
|
99
|
+
assert_equal 2, @album.id
|
100
|
+
assert_equal [], @album.songs
|
101
|
+
@album.links.must_equal({})
|
103
102
|
end
|
104
103
|
end
|
105
104
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'test_helper'
|
3
|
+
require 'roar/representer/json/hal'
|
4
|
+
|
5
|
+
|
6
|
+
class HalLinkTest < MiniTest::Spec
|
7
|
+
let(:rpr) do
|
8
|
+
Module.new do
|
9
|
+
include Roar::Representer::JSON
|
10
|
+
include Roar::Representer::JSON::HAL::Links
|
11
|
+
link :self do
|
12
|
+
"//songs"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
subject { Object.new.extend(rpr) }
|
18
|
+
|
19
|
+
describe "#to_json" do
|
20
|
+
it "uses 'links' key" do
|
21
|
+
assert_equal subject.to_json, "{\"links\":{\"self\":{\"href\":\"//songs\"}}}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#from_json" do
|
26
|
+
it "uses 'links' key" do
|
27
|
+
subject.from_json("{\"links\":{\"self\":{\"href\":\"//lifer\"}}}").links.values.must_equal [link(:href => "//lifer", :rel => :self)]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -44,6 +44,7 @@ class HttpVerbsTest < MiniTest::Spec
|
|
44
44
|
end
|
45
45
|
|
46
46
|
# FIXME: move to faraday test.
|
47
|
+
require 'roar/representer/transport/faraday'
|
47
48
|
describe 'a non-existent resource' do
|
48
49
|
it 'handles HTTP errors and raises a ResourceNotFound error with FaradayHttpTransport' do
|
49
50
|
@band.transport_engine = Roar::Representer::Transport::Faraday
|
@@ -73,7 +74,7 @@ class HttpVerbsTest < MiniTest::Spec
|
|
73
74
|
it "updates instance with incoming representation" do
|
74
75
|
@band.name = "Strung Out"
|
75
76
|
assert_equal nil, @band.label
|
76
|
-
|
77
|
+
|
77
78
|
@band.post("http://roar.example.com/bands", "application/xml")
|
78
79
|
assert_equal "STRUNG OUT", @band.name
|
79
80
|
assert_equal nil, @band.label
|
data/test/hypermedia_test.rb
CHANGED
@@ -43,6 +43,17 @@ class HypermediaTest < MiniTest::Spec
|
|
43
43
|
it "receives options when rendering" do
|
44
44
|
subject.to_json(:id => 1).must_equal "{\"links\":[{\"rel\":\"self\",\"href\":\"//self/1\"}]}"
|
45
45
|
end
|
46
|
+
|
47
|
+
describe "in a composition" do
|
48
|
+
representer_for do
|
49
|
+
property :entity, :extend => self
|
50
|
+
link(:self) { |opts| "//self/#{opts[:id]}" }
|
51
|
+
end
|
52
|
+
|
53
|
+
it "propagates options" do
|
54
|
+
Song.new(:entity => Song.new).extend(rpr).to_json(:id => 1).must_equal "{\"entity\":{\"links\":[{\"rel\":\"self\",\"href\":\"//self/1\"}]},\"links\":[{\"rel\":\"self\",\"href\":\"//self/1\"}]}"
|
55
|
+
end
|
56
|
+
end
|
46
57
|
end
|
47
58
|
|
48
59
|
describe "returning option hash from block" do
|
data/test/test_helper.rb
CHANGED
@@ -3,6 +3,7 @@ Bundler.setup
|
|
3
3
|
|
4
4
|
require 'test/unit'
|
5
5
|
require 'minitest/spec'
|
6
|
+
require 'ostruct'
|
6
7
|
|
7
8
|
require 'roar/representer'
|
8
9
|
require 'roar/representer/feature/http_verbs'
|
@@ -17,7 +18,7 @@ begin
|
|
17
18
|
rescue LoadError
|
18
19
|
end
|
19
20
|
|
20
|
-
module AttributesConstructor
|
21
|
+
module AttributesConstructor # TODO: remove me.
|
21
22
|
def initialize(attrs={})
|
22
23
|
attrs.each do |k,v|
|
23
24
|
instance_variable_set("@#{k}", v)
|
@@ -25,19 +26,13 @@ module AttributesConstructor
|
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
28
|
-
class
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
class Position
|
34
|
-
include AttributesConstructor
|
35
|
-
attr_accessor :id, :item
|
29
|
+
class Song < OpenStruct
|
30
|
+
def ==(other)
|
31
|
+
name == other.name and track == other.track
|
32
|
+
end
|
36
33
|
end
|
37
34
|
|
38
|
-
class
|
39
|
-
include AttributesConstructor
|
40
|
-
attr_accessor :id, :items
|
35
|
+
class Album < OpenStruct
|
41
36
|
end
|
42
37
|
|
43
38
|
require "test_xml/mini_test"
|
@@ -55,11 +50,10 @@ MiniTest::Spec.class_eval do
|
|
55
50
|
Roar::Representer::Feature::Hypermedia::Hyperlink.new(options)
|
56
51
|
end
|
57
52
|
|
58
|
-
def self.representer_for(&block)
|
53
|
+
def self.representer_for(modules=[Roar::Representer::JSON, Roar::Representer::Feature::Hypermedia], &block)
|
59
54
|
let (:rpr) do
|
60
55
|
Module.new do
|
61
|
-
include
|
62
|
-
include Roar::Representer::Feature::Hypermedia
|
56
|
+
include *modules.reverse
|
63
57
|
|
64
58
|
instance_exec(&block)
|
65
59
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: representable
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- README.textile
|
91
91
|
- Rakefile
|
92
92
|
- TODO.markdown
|
93
|
+
- gemfiles/Gemfile.representable-1.3
|
93
94
|
- lib/roar.rb
|
94
95
|
- lib/roar/representer.rb
|
95
96
|
- lib/roar/representer/feature/client.rb
|
@@ -106,47 +107,16 @@ files:
|
|
106
107
|
- test/Gemfile
|
107
108
|
- test/client_test.rb
|
108
109
|
- test/coercion_feature_test.rb
|
109
|
-
- test/dummy/Rakefile
|
110
|
-
- test/dummy/app/controllers/albums_controller.rb
|
111
|
-
- test/dummy/app/controllers/application_controller.rb
|
112
|
-
- test/dummy/app/helpers/application_helper.rb
|
113
|
-
- test/dummy/app/models/album.rb
|
114
|
-
- test/dummy/app/models/song.rb
|
115
|
-
- test/dummy/app/representers/representer/xml/album.rb
|
116
|
-
- test/dummy/app/representers/representer/xml/song.rb
|
117
|
-
- test/dummy/app/views/layouts/application.html.erb
|
118
|
-
- test/dummy/config.ru
|
119
|
-
- test/dummy/config/application.rb
|
120
|
-
- test/dummy/config/boot.rb
|
121
|
-
- test/dummy/config/database.yml
|
122
|
-
- test/dummy/config/environment.rb
|
123
|
-
- test/dummy/config/environments/development.rb
|
124
|
-
- test/dummy/config/environments/production.rb
|
125
|
-
- test/dummy/config/environments/test.rb
|
126
|
-
- test/dummy/config/locales/en.yml
|
127
|
-
- test/dummy/config/routes.rb
|
128
|
-
- test/dummy/db/development.sqlite3
|
129
|
-
- test/dummy/db/migrate/20110514114753_create_albums.rb
|
130
|
-
- test/dummy/db/migrate/20110514121228_create_songs.rb
|
131
|
-
- test/dummy/db/schema.rb
|
132
|
-
- test/dummy/db/test.sqlite3
|
133
|
-
- test/dummy/public/404.html
|
134
|
-
- test/dummy/public/422.html
|
135
|
-
- test/dummy/public/500.html
|
136
|
-
- test/dummy/public/favicon.ico
|
137
|
-
- test/dummy/script/rails
|
138
110
|
- test/fake_server.rb
|
139
111
|
- test/faraday_http_transport_test.rb
|
140
112
|
- test/hal_json_test.rb
|
113
|
+
- test/hal_links_test.rb
|
141
114
|
- test/http_verbs_feature_test.rb
|
142
115
|
- test/hypermedia_feature_test.rb
|
143
116
|
- test/hypermedia_test.rb
|
144
|
-
- test/integration_test.rb
|
145
117
|
- test/json_representer_test.rb
|
146
118
|
- test/net_http_transport_test.rb
|
147
119
|
- test/order_representers.rb
|
148
|
-
- test/rails/controller_methods_test.rb
|
149
|
-
- test/rails/rails_representer_methods_test.rb
|
150
120
|
- test/representer_test.rb
|
151
121
|
- test/test_helper.rb
|
152
122
|
- test/xml_representer_test.rb
|
data/test/dummy/Rakefile
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
2
|
-
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
3
|
-
|
4
|
-
require File.expand_path('../config/application', __FILE__)
|
5
|
-
require 'rake'
|
6
|
-
|
7
|
-
Rails::Application.load_tasks
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'roar/rails'
|
2
|
-
|
3
|
-
class AlbumsController < ActionController::Base
|
4
|
-
include Roar::Rails::ControllerMethods
|
5
|
-
|
6
|
-
respond_to :xml
|
7
|
-
represents Album
|
8
|
-
|
9
|
-
def show
|
10
|
-
@album = Album.find(params[:id])
|
11
|
-
respond_with @album
|
12
|
-
end
|
13
|
-
|
14
|
-
def create
|
15
|
-
@album = Album.create(representation)
|
16
|
-
|
17
|
-
respond_with @album
|
18
|
-
end
|
19
|
-
|
20
|
-
def update
|
21
|
-
@album = Album.find(params[:id])
|
22
|
-
@album.songs.delete_all # make PUT behave REST-compliant.
|
23
|
-
@album.update_attributes(representation)
|
24
|
-
|
25
|
-
respond_with @album
|
26
|
-
end
|
27
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Representer
|
2
|
-
module XML
|
3
|
-
class Album < Roar::Representer::XML
|
4
|
-
self.representation_name= :album
|
5
|
-
|
6
|
-
property :id
|
7
|
-
property :year
|
8
|
-
collection :songs
|
9
|
-
|
10
|
-
link :self do
|
11
|
-
album_url(represented.id)
|
12
|
-
end
|
13
|
-
|
14
|
-
link "album-search" do
|
15
|
-
album_search_url
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
data/test/dummy/config.ru
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require File.expand_path('../boot', __FILE__)
|
2
|
-
|
3
|
-
require "active_model/railtie"
|
4
|
-
require "action_controller/railtie"
|
5
|
-
require "action_view/railtie"
|
6
|
-
require "active_record/railtie"
|
7
|
-
|
8
|
-
Bundler.require
|
9
|
-
|
10
|
-
|
11
|
-
#require "rails_app"
|
12
|
-
|
13
|
-
module Dummy
|
14
|
-
class Application < Rails::Application
|
15
|
-
config.encoding = "utf-8"
|
16
|
-
|
17
|
-
# Configure sensitive parameters which will be filtered from the log file.
|
18
|
-
config.filter_parameters += [:password]
|
19
|
-
end
|
20
|
-
end
|
data/test/dummy/config/boot.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# SQLite version 3.x
|
2
|
-
# gem install sqlite3-ruby (not necessary on OS X Leopard)
|
3
|
-
development:
|
4
|
-
adapter: sqlite3
|
5
|
-
database: db/development.sqlite3
|
6
|
-
pool: 5
|
7
|
-
timeout: 5000
|
8
|
-
|
9
|
-
# Warning: The database defined as "test" will be erased and
|
10
|
-
# re-generated from your development database when you run "rake".
|
11
|
-
# Do not set this db to the same as development or production.
|
12
|
-
test:
|
13
|
-
adapter: sqlite3
|
14
|
-
database: db/test.sqlite3
|
15
|
-
pool: 5
|
16
|
-
timeout: 5000
|
17
|
-
|
18
|
-
production:
|
19
|
-
adapter: sqlite3
|
20
|
-
database: db/production.sqlite3
|
21
|
-
pool: 5
|
22
|
-
timeout: 5000
|
@@ -1,16 +0,0 @@
|
|
1
|
-
Dummy::Application.configure do
|
2
|
-
# Settings specified here will take precedence over those in config/environment.rb
|
3
|
-
|
4
|
-
# In the development environment your application's code is reloaded on
|
5
|
-
# every request. This slows down response time but is perfect for development
|
6
|
-
# since you don't have to restart the webserver when you make code changes.
|
7
|
-
config.cache_classes = false
|
8
|
-
|
9
|
-
# Log error messages when you accidentally call methods on nil.
|
10
|
-
config.whiny_nils = true
|
11
|
-
|
12
|
-
# Show full error reports and disable caching
|
13
|
-
config.consider_all_requests_local = true
|
14
|
-
config.action_view.debug_rjs = true
|
15
|
-
config.action_controller.perform_caching = false
|
16
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
Dummy::Application.configure do
|
2
|
-
# Settings specified here will take precedence over those in config/environment.rb
|
3
|
-
|
4
|
-
# The production environment is meant for finished, "live" apps.
|
5
|
-
# Code is not reloaded between requests
|
6
|
-
config.cache_classes = true
|
7
|
-
|
8
|
-
# Full error reports are disabled and caching is turned on
|
9
|
-
config.consider_all_requests_local = false
|
10
|
-
config.action_controller.perform_caching = true
|
11
|
-
|
12
|
-
# Specifies the header that your server uses for sending files
|
13
|
-
config.action_dispatch.x_sendfile_header = "X-Sendfile"
|
14
|
-
|
15
|
-
# For nginx:
|
16
|
-
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
|
17
|
-
|
18
|
-
# If you have no front-end server that supports something like X-Sendfile,
|
19
|
-
# just comment this out and Rails will serve the files
|
20
|
-
|
21
|
-
# See everything in the log (default is :info)
|
22
|
-
# config.log_level = :debug
|
23
|
-
|
24
|
-
# Use a different logger for distributed setups
|
25
|
-
# config.logger = SyslogLogger.new
|
26
|
-
|
27
|
-
# Use a different cache store in production
|
28
|
-
# config.cache_store = :mem_cache_store
|
29
|
-
|
30
|
-
# Disable Rails's static asset server
|
31
|
-
# In production, Apache or nginx will already do this
|
32
|
-
config.serve_static_assets = false
|
33
|
-
|
34
|
-
# Enable serving of images, stylesheets, and javascripts from an asset server
|
35
|
-
# config.action_controller.asset_host = "http://assets.example.com"
|
36
|
-
|
37
|
-
# Disable delivery errors, bad email addresses will be ignored
|
38
|
-
# config.action_mailer.raise_delivery_errors = false
|
39
|
-
|
40
|
-
# Enable threaded mode
|
41
|
-
# config.threadsafe!
|
42
|
-
|
43
|
-
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
44
|
-
# the I18n.default_locale when a translation can not be found)
|
45
|
-
config.i18n.fallbacks = true
|
46
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
Dummy::Application.configure do
|
2
|
-
# Settings specified here will take precedence over those in config/environment.rb
|
3
|
-
|
4
|
-
# The test environment is used exclusively to run your application's
|
5
|
-
# test suite. You never need to work with it otherwise. Remember that
|
6
|
-
# your test database is "scratch space" for the test suite and is wiped
|
7
|
-
# and recreated between test runs. Don't rely on the data there!
|
8
|
-
config.cache_classes = true
|
9
|
-
|
10
|
-
# Log error messages when you accidentally call methods on nil.
|
11
|
-
config.whiny_nils = true
|
12
|
-
|
13
|
-
# Show full error reports and disable caching
|
14
|
-
config.consider_all_requests_local = true
|
15
|
-
config.action_controller.perform_caching = false
|
16
|
-
|
17
|
-
# Raise exceptions instead of rendering exception templates
|
18
|
-
config.action_dispatch.show_exceptions = false
|
19
|
-
|
20
|
-
# Disable request forgery protection in test environment
|
21
|
-
config.action_controller.allow_forgery_protection = false
|
22
|
-
|
23
|
-
# Tell Action Mailer not to deliver emails to the real world.
|
24
|
-
# The :test delivery method accumulates sent emails in the
|
25
|
-
# ActionMailer::Base.deliveries array.
|
26
|
-
#config.action_mailer.delivery_method = :test
|
27
|
-
|
28
|
-
# Use SQL instead of Active Record's schema dumper when creating the test database.
|
29
|
-
# This is necessary if your schema can't be completely dumped by the schema dumper,
|
30
|
-
# like if you have constraints or database-specific column types
|
31
|
-
# config.active_record.schema_format = :sql
|
32
|
-
end
|
data/test/dummy/config/routes.rb
DELETED
Binary file
|
data/test/dummy/db/schema.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# This file is auto-generated from the current state of the database. Instead
|
2
|
-
# of editing this file, please use the migrations feature of Active Record to
|
3
|
-
# incrementally modify your database, and then regenerate this schema definition.
|
4
|
-
#
|
5
|
-
# Note that this schema.rb definition is the authoritative source for your
|
6
|
-
# database schema. If you need to create the application database on another
|
7
|
-
# system, you should be using db:schema:load, not running all the migrations
|
8
|
-
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
9
|
-
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
10
|
-
#
|
11
|
-
# It's strongly recommended to check this file into your version control system.
|
12
|
-
|
13
|
-
ActiveRecord::Schema.define(:version => 20110514121228) do
|
14
|
-
|
15
|
-
create_table "albums", :force => true do |t|
|
16
|
-
t.string "title"
|
17
|
-
t.string "year"
|
18
|
-
t.datetime "created_at"
|
19
|
-
t.datetime "updated_at"
|
20
|
-
end
|
21
|
-
|
22
|
-
create_table "songs", :force => true do |t|
|
23
|
-
t.string "title"
|
24
|
-
t.integer "album_id"
|
25
|
-
t.datetime "created_at"
|
26
|
-
t.datetime "updated_at"
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
data/test/dummy/db/test.sqlite3
DELETED
File without changes
|
data/test/dummy/public/404.html
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>The page you were looking for doesn't exist (404)</title>
|
5
|
-
<style type="text/css">
|
6
|
-
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
-
div.dialog {
|
8
|
-
width: 25em;
|
9
|
-
padding: 0 4em;
|
10
|
-
margin: 4em auto 0 auto;
|
11
|
-
border: 1px solid #ccc;
|
12
|
-
border-right-color: #999;
|
13
|
-
border-bottom-color: #999;
|
14
|
-
}
|
15
|
-
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
-
</style>
|
17
|
-
</head>
|
18
|
-
|
19
|
-
<body>
|
20
|
-
<!-- This file lives in public/404.html -->
|
21
|
-
<div class="dialog">
|
22
|
-
<h1>The page you were looking for doesn't exist.</h1>
|
23
|
-
<p>You may have mistyped the address or the page may have moved.</p>
|
24
|
-
</div>
|
25
|
-
</body>
|
26
|
-
</html>
|
data/test/dummy/public/422.html
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>The change you wanted was rejected (422)</title>
|
5
|
-
<style type="text/css">
|
6
|
-
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
-
div.dialog {
|
8
|
-
width: 25em;
|
9
|
-
padding: 0 4em;
|
10
|
-
margin: 4em auto 0 auto;
|
11
|
-
border: 1px solid #ccc;
|
12
|
-
border-right-color: #999;
|
13
|
-
border-bottom-color: #999;
|
14
|
-
}
|
15
|
-
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
-
</style>
|
17
|
-
</head>
|
18
|
-
|
19
|
-
<body>
|
20
|
-
<!-- This file lives in public/422.html -->
|
21
|
-
<div class="dialog">
|
22
|
-
<h1>The change you wanted was rejected.</h1>
|
23
|
-
<p>Maybe you tried to change something you didn't have access to.</p>
|
24
|
-
</div>
|
25
|
-
</body>
|
26
|
-
</html>
|
data/test/dummy/public/500.html
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>We're sorry, but something went wrong (500)</title>
|
5
|
-
<style type="text/css">
|
6
|
-
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
-
div.dialog {
|
8
|
-
width: 25em;
|
9
|
-
padding: 0 4em;
|
10
|
-
margin: 4em auto 0 auto;
|
11
|
-
border: 1px solid #ccc;
|
12
|
-
border-right-color: #999;
|
13
|
-
border-bottom-color: #999;
|
14
|
-
}
|
15
|
-
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
-
</style>
|
17
|
-
</head>
|
18
|
-
|
19
|
-
<body>
|
20
|
-
<!-- This file lives in public/500.html -->
|
21
|
-
<div class="dialog">
|
22
|
-
<h1>We're sorry, but something went wrong.</h1>
|
23
|
-
<p>We've been notified about this issue and we'll take a look at it shortly.</p>
|
24
|
-
</div>
|
25
|
-
</body>
|
26
|
-
</html>
|
File without changes
|
data/test/dummy/script/rails
DELETED
@@ -1,6 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
-
|
4
|
-
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
5
|
-
require File.expand_path('../../config/boot', __FILE__)
|
6
|
-
require 'rails/commands'
|
data/test/integration_test.rb
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'roar/representer/json'
|
3
|
-
require 'roar/representer/feature/hypermedia'
|
4
|
-
|
5
|
-
class IntegrationTest < MiniTest::Spec
|
6
|
-
class Beer
|
7
|
-
include Roar::Representer::JSON
|
8
|
-
include Roar::Representer::Feature::Hypermedia
|
9
|
-
|
10
|
-
property :name
|
11
|
-
|
12
|
-
link :self do
|
13
|
-
"http://beers/#{name.downcase}"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class Beers
|
18
|
-
include Roar::Representer::JSON
|
19
|
-
include Roar::Representer::Feature::Hypermedia
|
20
|
-
|
21
|
-
collection :items, :class => Beer
|
22
|
-
end
|
23
|
-
|
24
|
-
describe "Beer service" do
|
25
|
-
it "provides a document for a particular beer" do
|
26
|
-
assert_equal "{\"beer\":{\"name\":\"Eisenbahn\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/eisenbahn\"}]}}", Beer.from_attributes(name: "Eisenbahn").to_json
|
27
|
-
end
|
28
|
-
|
29
|
-
it "provides a detailed beers list" do
|
30
|
-
beers = ["Jever", "Becks", "Eisenbahn", "Colorado"].collect do |name|
|
31
|
-
Beer.from_attributes(name: name)
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
list = Beers.new
|
36
|
-
list.items = beers
|
37
|
-
|
38
|
-
assert_equal "{\"beers\":{\"items\":[{\"name\":\"Jever\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/jever\"}]},{\"name\":\"Becks\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/becks\"}]},{\"name\":\"Eisenbahn\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/eisenbahn\"}]},{\"name\":\"Colorado\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/colorado\"}]}]}}", list.to_json
|
39
|
-
end
|
40
|
-
|
41
|
-
it "provides a pageable beers list without details" do
|
42
|
-
class BeerCollection
|
43
|
-
include Roar::Representer::JSON
|
44
|
-
include Roar::Representer::Feature::Hypermedia
|
45
|
-
|
46
|
-
attr_accessor :per_page, :current_page, :all_items
|
47
|
-
|
48
|
-
collection :beers, :class => Beer
|
49
|
-
property :total
|
50
|
-
|
51
|
-
def total
|
52
|
-
all_items.size
|
53
|
-
end
|
54
|
-
|
55
|
-
def beers
|
56
|
-
all_items[(current_page-1)*per_page..current_page*per_page-1]
|
57
|
-
end
|
58
|
-
|
59
|
-
link :next do
|
60
|
-
"http://beers/all?page=#{current_page+1}" if current_page < total / per_page
|
61
|
-
end
|
62
|
-
|
63
|
-
link :prev do
|
64
|
-
"http://beers/all?page=#{current_page-1}" if current_page > 1
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
beers = ["Jever", "Becks", "Eisenbahn", "Colorado"].collect do |name|
|
69
|
-
Beer.from_attributes(name: name)
|
70
|
-
end
|
71
|
-
|
72
|
-
|
73
|
-
list = BeerCollection.new
|
74
|
-
list.all_items = beers # this would be a AR collection from a #find.
|
75
|
-
list.current_page = 1
|
76
|
-
list.per_page = 2
|
77
|
-
|
78
|
-
assert_equal "{\"beer_collection\":{\"beers\":[{\"name\":\"Jever\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/jever\"}]},{\"name\":\"Becks\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/becks\"}]}],\"total\":4,\"links\":[{\"rel\":\"next\",\"href\":\"http://beers/all?page=2\"},{\"rel\":\"prev\"}]}}", list.to_json
|
79
|
-
|
80
|
-
|
81
|
-
list.current_page = 2
|
82
|
-
assert_equal "{\"beer_collection\":{\"beers\":[{\"name\":\"Eisenbahn\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/eisenbahn\"}]},{\"name\":\"Colorado\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/colorado\"}]}],\"total\":4,\"links\":[{\"rel\":\"next\"},{\"rel\":\"prev\",\"href\":\"http://beers/all?page=1\"}]}}", list.to_json
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
@@ -1,147 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'roar/rails/test_case'
|
3
|
-
require "dummy/config/environment"
|
4
|
-
require "rails/test_help" # adds stuff like @routes, etc.
|
5
|
-
|
6
|
-
module Representer
|
7
|
-
module BMP
|
8
|
-
class Album; end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class ControllerMethodsTest < ActionController::TestCase
|
13
|
-
tests AlbumsController
|
14
|
-
|
15
|
-
test "responds to #responder" do
|
16
|
-
assert_equal Roar::Rails::ControllerMethods::Responder, @controller.class.responder
|
17
|
-
end
|
18
|
-
|
19
|
-
test "responds to #represents" do
|
20
|
-
@controller = Class.new(AlbumsController)
|
21
|
-
assert_equal Album, @controller.represented_class
|
22
|
-
@controller.represents Song
|
23
|
-
assert_equal Song, @controller.represented_class
|
24
|
-
end
|
25
|
-
|
26
|
-
test "responds to #representer_class_for" do
|
27
|
-
assert_equal Representer::BMP::Album, @controller.representer_class_for(Album, :bmp)
|
28
|
-
end
|
29
|
-
|
30
|
-
test "responds to #representation" do
|
31
|
-
post :create, %{<album>
|
32
|
-
<year>2011</year>
|
33
|
-
<song>
|
34
|
-
<title>Walking In Your Footsteps</title>
|
35
|
-
</song>
|
36
|
-
</album>}, :format => :xml
|
37
|
-
|
38
|
-
|
39
|
-
assert_equal({"id"=>"", "year"=>"2011",
|
40
|
-
"songs_attributes"=>[{"title"=>"Walking In Your Footsteps"}]}, @controller.representation)
|
41
|
-
end
|
42
|
-
|
43
|
-
test "responds to #incoming" do
|
44
|
-
post :create, %{<album>
|
45
|
-
<year>2011</year>
|
46
|
-
<song>
|
47
|
-
<title>Walking In Your Footsteps</title>
|
48
|
-
</song>
|
49
|
-
</album>}, :format => :xml
|
50
|
-
|
51
|
-
|
52
|
-
assert_equal({"id"=>"", "year"=>"2011",
|
53
|
-
"songs"=>[{"title"=>"Walking In Your Footsteps"}], "links"=>[]}, @controller.incoming.to_attributes)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
class ControllerFunctionalTest < ActionController::TestCase
|
59
|
-
tests AlbumsController
|
60
|
-
|
61
|
-
test "GET: returns a xml representation" do
|
62
|
-
get :show, :id => 1, :format => :xml
|
63
|
-
|
64
|
-
assert_response 200
|
65
|
-
assert_body %{
|
66
|
-
<album>
|
67
|
-
<id>1</id>
|
68
|
-
<year>2011</year>
|
69
|
-
<song>
|
70
|
-
<title>Alltax</title>
|
71
|
-
</song>
|
72
|
-
<song>
|
73
|
-
<title>Bali</title>
|
74
|
-
</song>
|
75
|
-
|
76
|
-
<link rel="self" href="http://test.host/albums/1" />
|
77
|
-
<link rel="album-search" href="http://test.host/articles/starts_with/{query}" />
|
78
|
-
</album>}, :format => :xml
|
79
|
-
end
|
80
|
-
|
81
|
-
test "POST: creates a new album and returns the xml representation" do
|
82
|
-
post :create, %{<album>
|
83
|
-
<year>1997</year>
|
84
|
-
<song>
|
85
|
-
<title>Cooler Than You</title>
|
86
|
-
</song>
|
87
|
-
</album>}, :format => :xml
|
88
|
-
|
89
|
-
assert @album = Album.find(:last)
|
90
|
-
assert_equal "1997", @album.year
|
91
|
-
assert_equal "Cooler Than You", @album.songs.first.title
|
92
|
-
|
93
|
-
assert_response 201, "Location" => album_url(@album) # Created
|
94
|
-
assert_body %{
|
95
|
-
<album>
|
96
|
-
<id>2</id>
|
97
|
-
<year>1997</year>
|
98
|
-
<song>
|
99
|
-
<title>Cooler Than You</title>
|
100
|
-
</song>
|
101
|
-
|
102
|
-
<link rel="self" href="http://test.host/albums/2" />
|
103
|
-
<link rel="album-search" href="http://test.host/articles/starts_with/{query}" />
|
104
|
-
</album>}, :format => :xml
|
105
|
-
end
|
106
|
-
|
107
|
-
test "POST: invalid incoming representations yields to 422" do
|
108
|
-
post :create, :format => :xml
|
109
|
-
|
110
|
-
assert_response 422 # Unprocessable Entity
|
111
|
-
end
|
112
|
-
|
113
|
-
test "PUT: updates album and returns the xml representation" do
|
114
|
-
put :update, %{
|
115
|
-
<album>
|
116
|
-
<year>1997</year>
|
117
|
-
<song>
|
118
|
-
<title>Cooler Than You</title>
|
119
|
-
</song>
|
120
|
-
<song>
|
121
|
-
<title>Rubbing The Elf</title>
|
122
|
-
</song>
|
123
|
-
</album>}, :id => 1, :format => :xml
|
124
|
-
|
125
|
-
assert @album = Album.find(1)
|
126
|
-
assert_equal "1997", @album.year
|
127
|
-
assert_equal 2, @album.songs.size
|
128
|
-
assert_equal "Cooler Than You", @album.songs.first.title
|
129
|
-
assert_equal "Rubbing The Elf", @album.songs.last.title
|
130
|
-
|
131
|
-
assert_response 200
|
132
|
-
assert_body %{
|
133
|
-
<album>
|
134
|
-
<id>1</id>
|
135
|
-
<year>1997</year>
|
136
|
-
<song>
|
137
|
-
<title>Cooler Than You</title>
|
138
|
-
</song>
|
139
|
-
<song>
|
140
|
-
<title>Rubbing The Elf</title>
|
141
|
-
</song>
|
142
|
-
|
143
|
-
<link rel="self" href="http://test.host/albums/1" />
|
144
|
-
<link rel="album-search" href="http://test.host/articles/starts_with/{query}" />
|
145
|
-
</album>}, :format => :xml
|
146
|
-
end
|
147
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require "dummy/config/environment"
|
3
|
-
require 'roar/rails'
|
4
|
-
|
5
|
-
module Representer
|
6
|
-
module JPG
|
7
|
-
class Song; end
|
8
|
-
class Album < Roar::Representer::XML; end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
class RailsRepresenterMethodsTest < MiniTest::Spec
|
15
|
-
describe "Rails::RepresenterMethods" do
|
16
|
-
before do
|
17
|
-
@c = Representer::JPG::Album # TODO: mix Rails into Base, not XML only.
|
18
|
-
end
|
19
|
-
|
20
|
-
it "provides conventions for #collection" do
|
21
|
-
@c.collection :songs
|
22
|
-
|
23
|
-
@d = @c.representable_attrs.first
|
24
|
-
assert_equal Representer::JPG::Song, @d.sought_type
|
25
|
-
assert @d.array?
|
26
|
-
end
|
27
|
-
|
28
|
-
it "provides conventions for #representation_name" do
|
29
|
-
assert_equal "album", @c.representation_name
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|