roar 0.11.7 → 0.11.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|