supplejack_client 1.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +27 -0
- data/.rspec +2 -0
- data/Gemfile +16 -0
- data/Guardfile +24 -0
- data/LICENSE.txt +674 -0
- data/README.md +153 -0
- data/Rakefile +9 -0
- data/lib/generators/locales/en.yml +11 -0
- data/lib/generators/supplejack/install_generator.rb +28 -0
- data/lib/generators/templates/README +19 -0
- data/lib/generators/templates/supplejack_client.rb +120 -0
- data/lib/supplejack/config.rb +116 -0
- data/lib/supplejack/controllers/helpers.rb +172 -0
- data/lib/supplejack/engine.rb +20 -0
- data/lib/supplejack/exceptions.rb +17 -0
- data/lib/supplejack/facet.rb +33 -0
- data/lib/supplejack/item.rb +94 -0
- data/lib/supplejack/item_relation.rb +73 -0
- data/lib/supplejack/log_subscriber.rb +58 -0
- data/lib/supplejack/paginated_collection.rb +61 -0
- data/lib/supplejack/record.rb +147 -0
- data/lib/supplejack/request.rb +95 -0
- data/lib/supplejack/search.rb +346 -0
- data/lib/supplejack/url_formats/item_hash.rb +208 -0
- data/lib/supplejack/user.rb +132 -0
- data/lib/supplejack/user_set.rb +349 -0
- data/lib/supplejack/user_set_relation.rb +143 -0
- data/lib/supplejack/util.rb +120 -0
- data/lib/supplejack/version.rb +10 -0
- data/lib/supplejack_client.rb +29 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/supplejack/controllers/helpers_spec.rb +277 -0
- data/spec/supplejack/facet_spec.rb +44 -0
- data/spec/supplejack/item_relation_spec.rb +111 -0
- data/spec/supplejack/item_spec.rb +115 -0
- data/spec/supplejack/log_subscriber_spec.rb +40 -0
- data/spec/supplejack/paginated_collection_spec.rb +43 -0
- data/spec/supplejack/record_spec.rb +255 -0
- data/spec/supplejack/request_spec.rb +195 -0
- data/spec/supplejack/search_spec.rb +727 -0
- data/spec/supplejack/url_formats/item_hash_spec.rb +341 -0
- data/spec/supplejack/user_set_relation_spec.rb +149 -0
- data/spec/supplejack/user_set_spec.rb +465 -0
- data/spec/supplejack/user_spec.rb +159 -0
- data/supplejack_client.gemspec +30 -0
- metadata +159 -0
@@ -0,0 +1,143 @@
|
|
1
|
+
# The Supplejack Client code is Crown copyright (C) 2014, New Zealand Government,
|
2
|
+
# and is licensed under the GNU General Public License, version 3.
|
3
|
+
# See https://github.com/DigitalNZ/supplejack_client for details.
|
4
|
+
#
|
5
|
+
# Supplejack was created by DigitalNZ at the National Library of NZ
|
6
|
+
# and the Department of Internal Affairs. http://digitalnz.org/supplejack
|
7
|
+
|
8
|
+
module Supplejack
|
9
|
+
|
10
|
+
# The +UserSetRelation+ class provides ActiveRecord like functionality to the
|
11
|
+
# relationship between a User object and it's UserSet objects.
|
12
|
+
#
|
13
|
+
# @exmaple
|
14
|
+
# user = Supplejack::User.find(1)
|
15
|
+
#
|
16
|
+
# user.sets.build({name: "Dogs and cats"}) => Returns a new UserSet object linked to the User
|
17
|
+
# user.sets.find(123) => Return a UserSet object which belongs to the User
|
18
|
+
# user.sets.order(:name) => Return a array of UserSet objects ordered by name
|
19
|
+
#
|
20
|
+
class UserSetRelation
|
21
|
+
include Supplejack::Request
|
22
|
+
|
23
|
+
attr_reader :user
|
24
|
+
|
25
|
+
def initialize(user)
|
26
|
+
@user = user
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns an array of UserSet objects and memoizes the array
|
30
|
+
#
|
31
|
+
def sets
|
32
|
+
@sets ||= self.fetch_sets
|
33
|
+
end
|
34
|
+
|
35
|
+
# Initialize an array of UserSet objects and orders them by priority.
|
36
|
+
#
|
37
|
+
# @return [ Array ] A Array of +Supplejack::UserSet+ objects
|
38
|
+
#
|
39
|
+
def fetch_sets
|
40
|
+
response = sets_response
|
41
|
+
sets_array = response["sets"] || []
|
42
|
+
@sets = sets_array.map {|attributes| Supplejack::UserSet.new(attributes) }.sort_by { |set| set.priority }
|
43
|
+
end
|
44
|
+
|
45
|
+
# Execute a GET request to the API to retrieve the user_sets from a User.
|
46
|
+
# It caches the response from the API for a day. The cache is invalidated
|
47
|
+
# every time any set for the user changes.
|
48
|
+
#
|
49
|
+
# @return [ Hash ] A hash parsed from a JSON string. See the API Documentation for more details.
|
50
|
+
#
|
51
|
+
def sets_response
|
52
|
+
params = {}
|
53
|
+
|
54
|
+
if user.use_own_api_key?
|
55
|
+
path = "/sets"
|
56
|
+
params[:api_key] = user.api_key
|
57
|
+
else
|
58
|
+
path = "/users/#{user.api_key}/sets"
|
59
|
+
end
|
60
|
+
|
61
|
+
if Supplejack.enable_caching
|
62
|
+
Rails.cache.fetch(path, expires_in: 1.day) do
|
63
|
+
get(path, params)
|
64
|
+
end
|
65
|
+
else
|
66
|
+
get(path, params)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Finds a UserSet object with the provided ID that belongs to the current
|
71
|
+
# User
|
72
|
+
#
|
73
|
+
# @param [ String ] A 24 character string representing the UserSet ID
|
74
|
+
#
|
75
|
+
# @return [ Supplejack::UserSet ] A UserSet object
|
76
|
+
#
|
77
|
+
def find(user_set_id)
|
78
|
+
Supplejack::UserSet.find(user_set_id, self.user.api_key)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Initializes a new UserSet object and links it to the current User
|
82
|
+
#
|
83
|
+
# @param [ Hash ] A hash with the UserSet field names and values
|
84
|
+
#
|
85
|
+
# @return [ Supplejack::UserSet] A new UserSet object
|
86
|
+
#
|
87
|
+
def build(attributes={})
|
88
|
+
user_set = Supplejack::UserSet.new(attributes)
|
89
|
+
user_set.api_key = user.api_key
|
90
|
+
user_set
|
91
|
+
end
|
92
|
+
|
93
|
+
# Build and persist a UserSet object with the provided attributes
|
94
|
+
#
|
95
|
+
# @param [ Hash ] A hash with the UserSet field names and values
|
96
|
+
#
|
97
|
+
# @return [ Supplejack::UserSet ] A persisted UserSet object
|
98
|
+
#
|
99
|
+
def create(attributes={})
|
100
|
+
user_set = self.build(attributes)
|
101
|
+
user_set.save
|
102
|
+
user_set
|
103
|
+
end
|
104
|
+
|
105
|
+
# Return a array of UserSet objects ordered by the priority first and then
|
106
|
+
# in ascending order by the specified attribute.
|
107
|
+
#
|
108
|
+
# The only exception is for the "updated_at" attribute, for which ignores
|
109
|
+
# the priority and orders on descending order.
|
110
|
+
#
|
111
|
+
# @param [ Symbol ] A symbol with the attribute to order the UserSet objects on.
|
112
|
+
#
|
113
|
+
# @return [ Array ] A array of Supplejack::UserSet objects.
|
114
|
+
#
|
115
|
+
def order(attribute)
|
116
|
+
@sets = sets.sort_by do |set|
|
117
|
+
value = set.send(attribute)
|
118
|
+
value = value.downcase if value.is_a?(String)
|
119
|
+
attribute == :updated_at ? value : [set.priority, value]
|
120
|
+
end
|
121
|
+
@sets = @sets.reverse if attribute == :updated_at
|
122
|
+
@sets
|
123
|
+
end
|
124
|
+
|
125
|
+
# Returns an array of all UserSet objects for the current User
|
126
|
+
#
|
127
|
+
def all
|
128
|
+
self.sets
|
129
|
+
end
|
130
|
+
|
131
|
+
# Any method missing on this class is delegated to the UserSet objects array
|
132
|
+
# so that the developer can easily execute any Array method on the UserSetRelation
|
133
|
+
#
|
134
|
+
# @example
|
135
|
+
# user.sets.each .... => Iterate through the UserSet objects array
|
136
|
+
# user.sets.size => Get the size of the UserSet objects array
|
137
|
+
#
|
138
|
+
def method_missing(method, *args, &block)
|
139
|
+
sets.send(method, *args, &block)
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# The Supplejack Client code is Crown copyright (C) 2014, New Zealand Government,
|
2
|
+
# and is licensed under the GNU General Public License, version 3.
|
3
|
+
# See https://github.com/DigitalNZ/supplejack_client for details.
|
4
|
+
#
|
5
|
+
# Supplejack was created by DigitalNZ at the National Library of NZ
|
6
|
+
# and the Department of Internal Affairs. http://digitalnz.org/supplejack
|
7
|
+
|
8
|
+
module Supplejack
|
9
|
+
module Util
|
10
|
+
|
11
|
+
class << self
|
12
|
+
|
13
|
+
#
|
14
|
+
# Return a array no matter what.
|
15
|
+
#
|
16
|
+
def array(object)
|
17
|
+
case object
|
18
|
+
when Array
|
19
|
+
object
|
20
|
+
when NilClass
|
21
|
+
[]
|
22
|
+
else
|
23
|
+
[object]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# Try to parse any string into a Time object
|
29
|
+
#
|
30
|
+
def time(time)
|
31
|
+
begin
|
32
|
+
if time.is_a?(String)
|
33
|
+
time = Time.parse(time)
|
34
|
+
elsif time.is_a?(Time) || time.is_a?(DateTime)
|
35
|
+
time = time
|
36
|
+
end
|
37
|
+
rescue
|
38
|
+
time = nil
|
39
|
+
end
|
40
|
+
|
41
|
+
time
|
42
|
+
end
|
43
|
+
#
|
44
|
+
# Perform a deep merge of hashes, returning the result as a new hash.
|
45
|
+
# See #deep_merge_into for rules used to merge the hashes
|
46
|
+
#
|
47
|
+
# ==== Parameters
|
48
|
+
#
|
49
|
+
# left<Hash>:: Hash to merge
|
50
|
+
# right<Hash>:: The other hash to merge
|
51
|
+
#
|
52
|
+
# ==== Returns
|
53
|
+
#
|
54
|
+
# Hash:: New hash containing the given hashes deep-merged.
|
55
|
+
#
|
56
|
+
def deep_merge(left, right)
|
57
|
+
deep_merge_into({}, left, right)
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
61
|
+
# Perform a deep merge of the right hash into the left hash
|
62
|
+
#
|
63
|
+
# ==== Parameters
|
64
|
+
#
|
65
|
+
# left:: Hash to receive merge
|
66
|
+
# right:: Hash to merge into left
|
67
|
+
#
|
68
|
+
# ==== Returns
|
69
|
+
#
|
70
|
+
# Hash:: left
|
71
|
+
#
|
72
|
+
def deep_merge!(left, right)
|
73
|
+
deep_merge_into(left, left, right)
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
#
|
79
|
+
# Deep merge two hashes into a third hash, using rules that produce nice
|
80
|
+
# merged parameter hashes. The rules are as follows, for a given key:
|
81
|
+
#
|
82
|
+
# * If only one hash has a value, or if both hashes have the same value,
|
83
|
+
# just use the value.
|
84
|
+
# * If either of the values is not a hash, create arrays out of both
|
85
|
+
# values and concatenate them.
|
86
|
+
# * Otherwise, deep merge the two values (which are both hashes)
|
87
|
+
#
|
88
|
+
# ==== Parameters
|
89
|
+
#
|
90
|
+
# destination<Hash>:: Hash into which to perform the merge
|
91
|
+
# left<Hash>:: One hash to merge
|
92
|
+
# right<Hash>:: The other hash to merge
|
93
|
+
#
|
94
|
+
# ==== Returns
|
95
|
+
#
|
96
|
+
# Hash:: destination
|
97
|
+
#
|
98
|
+
def deep_merge_into(destination, left, right)
|
99
|
+
left.to_hash.symbolize_keys!
|
100
|
+
right.to_hash.symbolize_keys!
|
101
|
+
left.each_pair do |name, left_value|
|
102
|
+
right_value = right[name] if right
|
103
|
+
destination[name] =
|
104
|
+
if right_value.nil? || left_value == right_value
|
105
|
+
left_value
|
106
|
+
elsif !left_value.respond_to?(:each_pair) || !right_value.respond_to?(:each_pair)
|
107
|
+
Array(left_value) + Array(right_value)
|
108
|
+
else
|
109
|
+
merged_value = {}
|
110
|
+
deep_merge_into(merged_value, left_value, right_value)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
left_keys = Set.new(left.keys)
|
114
|
+
destination.merge!(right.reject { |k, v| left_keys.include?(k) })
|
115
|
+
destination
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# The Supplejack Client code is Crown copyright (C) 2014, New Zealand Government,
|
2
|
+
# and is licensed under the GNU General Public License, version 3.
|
3
|
+
# See https://github.com/DigitalNZ/supplejack_client for details.
|
4
|
+
#
|
5
|
+
# Supplejack was created by DigitalNZ at the National Library of NZ
|
6
|
+
# and the Department of Internal Affairs. http://digitalnz.org/supplejack
|
7
|
+
|
8
|
+
module Supplejack
|
9
|
+
VERSION = '1.0.1'
|
10
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# The Supplejack Client code is Crown copyright (C) 2014, New Zealand Government,
|
2
|
+
# and is licensed under the GNU General Public License, version 3.
|
3
|
+
# See https://github.com/DigitalNZ/supplejack_client for details.
|
4
|
+
#
|
5
|
+
# Supplejack was created by DigitalNZ at the National Library of NZ
|
6
|
+
# and the Department of Internal Affairs. http://digitalnz.org/supplejack
|
7
|
+
|
8
|
+
require 'supplejack/config'
|
9
|
+
require 'supplejack/version'
|
10
|
+
|
11
|
+
module Supplejack
|
12
|
+
extend Config
|
13
|
+
|
14
|
+
require 'supplejack/engine'
|
15
|
+
require 'supplejack/exceptions'
|
16
|
+
require 'supplejack/log_subscriber'
|
17
|
+
require 'supplejack/record'
|
18
|
+
require "supplejack/request"
|
19
|
+
require 'supplejack/paginated_collection'
|
20
|
+
require 'supplejack/controllers/helpers'
|
21
|
+
require 'supplejack/url_formats/item_hash'
|
22
|
+
require 'supplejack/util'
|
23
|
+
require 'supplejack/facet'
|
24
|
+
require 'supplejack/user_set'
|
25
|
+
require 'supplejack/item_relation'
|
26
|
+
require 'supplejack/item'
|
27
|
+
require 'supplejack/user'
|
28
|
+
require 'supplejack/user_set_relation'
|
29
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# The Supplejack Client code is Crown copyright (C) 2014, New Zealand Government,
|
2
|
+
# and is licensed under the GNU General Public License, version 3.
|
3
|
+
# See https://github.com/DigitalNZ/supplejack_client for details.
|
4
|
+
#
|
5
|
+
# Supplejack was created by DigitalNZ at the National Library of NZ
|
6
|
+
# and the Department of Internal Affairs. http://digitalnz.org/supplejack
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'bundler/setup'
|
10
|
+
|
11
|
+
Bundler.require(:default)
|
12
|
+
|
13
|
+
require 'supplejack_client'
|
14
|
+
require 'active_support/all'
|
15
|
+
|
16
|
+
RSpec.configure do |config|
|
17
|
+
# some (optional) config here
|
18
|
+
config.mock_with :rspec
|
19
|
+
|
20
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
21
|
+
config.filter_run :focus => true
|
22
|
+
config.run_all_when_everything_filtered = true
|
23
|
+
end
|
@@ -0,0 +1,277 @@
|
|
1
|
+
# The Supplejack Client code is Crown copyright (C) 2014, New Zealand Government,
|
2
|
+
# and is licensed under the GNU General Public License, version 3.
|
3
|
+
# See https://github.com/DigitalNZ/supplejack_client for details.
|
4
|
+
#
|
5
|
+
# Supplejack was created by DigitalNZ at the National Library of NZ
|
6
|
+
# and the Department of Internal Affairs. http://digitalnz.org/supplejack
|
7
|
+
|
8
|
+
require 'spec_helper'
|
9
|
+
require 'action_view'
|
10
|
+
require 'action_controller'
|
11
|
+
require 'rails_autolink/helpers'
|
12
|
+
|
13
|
+
include ActionView::Context
|
14
|
+
|
15
|
+
module FakeRoutes
|
16
|
+
def records_path(options={})
|
17
|
+
path = '/records'
|
18
|
+
path += "?#{options.to_query}" if options.any?
|
19
|
+
path
|
20
|
+
end
|
21
|
+
|
22
|
+
def record_path(id, options={})
|
23
|
+
path = "/records/#{id}"
|
24
|
+
path += "?#{options.to_query}" if options.any?
|
25
|
+
path
|
26
|
+
end
|
27
|
+
|
28
|
+
def url_for(options={})
|
29
|
+
options
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def mock_record(stubs={})
|
34
|
+
(@mock_record ||= double(:record).as_null_object).tap do |record|
|
35
|
+
record.stub(stubs) unless stubs.empty?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class AdvancedSearch < Supplejack::Search
|
40
|
+
end
|
41
|
+
|
42
|
+
module Supplejack
|
43
|
+
module Controllers
|
44
|
+
describe Helpers do
|
45
|
+
|
46
|
+
before(:each) do
|
47
|
+
@c = ActionController::Base.new
|
48
|
+
@c.class.send(:include, FakeRoutes)
|
49
|
+
@c.class.send(:include, Supplejack::Controllers::Helpers)
|
50
|
+
@c.class.send(:include, ActionView::Helpers)
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#search' do
|
54
|
+
before(:each) do
|
55
|
+
@c.stub(:params) {{:text => 'dog'}}
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'initializes a search object with the params' do
|
59
|
+
Supplejack::Search.should_receive(:new).with({:text => 'dog'})
|
60
|
+
@c.search
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'tries to initialize with params[:search] ' do
|
64
|
+
@c.stub(:params) {{:search => {:text => 'cat'}}}
|
65
|
+
Supplejack::Search.should_receive(:new).with({:text => 'cat'})
|
66
|
+
@c.search
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'initializes the search with the passed params' do
|
70
|
+
Supplejack::Search.should_receive(:new).with({:text => 'elephant'})
|
71
|
+
@c.search({:text => 'elephant'})
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'uses the special Search class' do
|
75
|
+
Supplejack.stub(:search_klass) { 'AdvancedSearch' }
|
76
|
+
AdvancedSearch.should_receive(:new).with({:text => 'dog'})
|
77
|
+
@c.search
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'memoizes the search object' do
|
81
|
+
@search = Supplejack::Search.new
|
82
|
+
Supplejack::Search.should_receive(:new).once.and_return(@search)
|
83
|
+
@c.search
|
84
|
+
@c.search
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'attribute' do
|
89
|
+
context 'nested attributes' do
|
90
|
+
before(:each) do
|
91
|
+
@user_set = Supplejack::UserSet.new(user: {name: 'Juanito'})
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'supports nested attributes' do
|
95
|
+
@c.attribute(@user_set, 'user.name').should eq %{<p><strong>User.name: </strong>Juanito</p>}
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'correctly uses the translation for the label' do
|
99
|
+
I18n.should_receive(:t).with('supplejack_user_sets.user.name', default: 'User.name') { 'By' }
|
100
|
+
@c.attribute(@user_set, 'user.name')
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'single value' do
|
105
|
+
before(:each) do
|
106
|
+
@record = mock_record({:title => 'Wellington', :content_partner => '', :description => nil})
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'returns the attribute name and its value' do
|
110
|
+
@c.attribute(@record, :title).should eq %{<p><strong>Title: </strong>Wellington</p>}
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'uses a div instead of a p' do
|
114
|
+
@c.attribute(@record, :title, {:tag => :div}).should eq %{<div><strong>Title: </strong>Wellington</div>}
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'does not use a tag if tag option is nil' do
|
118
|
+
@c.attribute(@record, :title, {:tag => nil}).should eq %{<strong>Title: </strong>Wellington}
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'truncates the content to 5 characters' do
|
122
|
+
@c.attribute(@record, :title, {:limit => 8}).should eq %{<p><strong>Title: </strong>Welli...</p>}
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'puts the label and the field value on seperate lines if label_inle is false' do
|
126
|
+
@c.attribute(@record, :title, {:label_inline => false}).should eq %{<p><strong>Title: </strong><br/>Wellington</p>}
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'removes the label' do
|
130
|
+
@c.attribute(@record, :title, {:label => false}).should eq %{<p>Wellington</p>}
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'doesn\'t display anything when the value is nil' do
|
134
|
+
@c.attribute(@record, :content_partner).should be_nil
|
135
|
+
@c.attribute(@record, :description).should be_nil
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'displays span label tag' do
|
139
|
+
@c.attribute(@record, :title, {:label_tag => :span}).should eq %{<p><span>Title: </span>Wellington</p>}
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'displays label tag with a class' do
|
143
|
+
@c.attribute(@record, :title, {:label_class => 'label'}).should eq %{<p><strong class="label">Title: </strong>Wellington</p>}
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'uses the translation key' do
|
147
|
+
I18n.should_receive(:t).with('item.key', :default => 'Title').and_return('Title')
|
148
|
+
@c.attribute(@record, :title, {:trans_key => 'item.key'})
|
149
|
+
end
|
150
|
+
|
151
|
+
context ':link => true' do
|
152
|
+
it 'converts it to a URL when value is a url' do
|
153
|
+
url = "http://google.com/images"
|
154
|
+
@record = mock_record({:landing_url => url})
|
155
|
+
@c.attribute(@record, :landing_url, {:link => true}).should eq %{<p><strong>Landing_url: </strong>#{@c.link_to url, url}</p>}
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'links to the URL when the value contains both a URL and text' do
|
159
|
+
url = 'http://google.com/images'
|
160
|
+
@record = mock_record({:source => "Image location #{url}"})
|
161
|
+
@c.attribute(@record, :source, {:link => true}).should eq %{<p><strong>Source: </strong>Image location #{@c.link_to url, url}</p>}
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'converts it to a URL with the url pattern in :link and replaces the value' do
|
165
|
+
@record = mock_record({:subject => ['New Zealand']})
|
166
|
+
@c.attribute(@record, :subject, :link => '/records?i[subject_text]={{value}}').should eq %{<p><strong>Subject: </strong>#{@c.link_to "New Zealand", "/records?i[subject_text]=New Zealand"}</p>}
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'returns nothing when value is nil' do
|
170
|
+
@c.attribute(@record, :description, {:link => true}).should be_nil
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'returns nothing when value is "Not specified"' do
|
175
|
+
record = mock_record({:description => 'Not specified'})
|
176
|
+
@c.attribute(record, :description).should be_nil
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'adds extra_html inside of the <p>' do
|
180
|
+
@c.attribute(@record, :title, {:extra_html => @c.content_tag(:span, 'Hi!')}).should eq %{<p><strong>Title: </strong>Wellington<span>Hi!</span></p>}
|
181
|
+
end
|
182
|
+
|
183
|
+
context 'default HTML values' do
|
184
|
+
it 'uses the tag defined in the config' do
|
185
|
+
Supplejack.stub(:attribute_tag) { :span }
|
186
|
+
@c.attribute(@record, :title).should eq %{<span><strong>Title: </strong>Wellington</span>}
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'uses the label tag defined in the config' do
|
190
|
+
Supplejack.stub(:label_tag) { :b }
|
191
|
+
@c.attribute(@record, :title).should eq %{<p><b>Title: </b>Wellington</p>}
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'uses the label class defined in the config' do
|
195
|
+
Supplejack.stub(:label_class) { 'label' }
|
196
|
+
@c.attribute(@record, :title).should eq %{<p><strong class="label">Title: </strong>Wellington</p>}
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context 'multiple values' do
|
202
|
+
before(:each) do
|
203
|
+
@record = mock_record({:category => ['Images', 'Videos']})
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'displays the values separated by commas' do
|
207
|
+
@c.attribute(@record, :category).should eq %{<p><strong>Category: </strong>Images, Videos</p>}
|
208
|
+
end
|
209
|
+
|
210
|
+
it 'displays the values separated by another delimiter' do
|
211
|
+
@c.attribute(@record, :category, {:delimiter => ':'}).should eq %{<p><strong>Category: </strong>Images:Videos</p>}
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'limits the amount of values returned' do
|
215
|
+
@c.attribute(@record, :category, {:limit => 1}).should eq %{<p><strong>Category: </strong>Images</p>}
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'limits the amount of values returned when less than 20' do
|
219
|
+
@record.stub(:category) { (1..30).to_a.map(&:to_s) }
|
220
|
+
@c.attribute(@record, :category, {:limit => 10}).should eq %{<p><strong>Category: </strong>1, 2, 3, 4, 5, 6, 7, 8, 9, 10</p>}
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'generates links for every value' do
|
224
|
+
@link1 = @c.link_to('Images', "/records?#{{:i => {:category => 'Images'}}.to_query}")
|
225
|
+
@link2 = @c.link_to('Videos', "/records?#{{:i => {:category => 'Videos'}}.to_query}")
|
226
|
+
@c.attribute(@record, :category, {:link_path => "records_path"}).should eq %{<p><strong>Category: </strong>#{@link1}, #{@link2}</p>}
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'converts every value to a URL when :link => true and value is a url' do
|
230
|
+
url1 = 'http://google.com/images'
|
231
|
+
url2 = 'http://yahoo.com/photos'
|
232
|
+
@record = mock_record({:landing_url => [url1, url2]})
|
233
|
+
@c.attribute(@record, :landing_url, {:link => true}).should eq %{<p><strong>Landing_url: </strong>#{@c.link_to url1, url1}, #{@c.link_to url2, url2}</p>}
|
234
|
+
end
|
235
|
+
|
236
|
+
it 'truncates the sum of all elements in the array' do
|
237
|
+
@record = mock_record({:description => ['This is a lengthy description', 'Some other stuff']})
|
238
|
+
@c.attribute(@record, :description, :limit => 40, :label => false).should eq "<p>This is a lengthy description, Some o...</p>"
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'converts it to a URL with the url pattern in :link and replaces the value for each value' do
|
242
|
+
@c.attribute(@record, :category, :link => '/records?i[category]={{value}}').should eq %{<p><strong>Category: </strong>#{@c.link_to "Images", "/records?i[category]=Images"}, #{@c.link_to "Videos", "/records?i[category]=Videos"}</p>}
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
context 'multiple attributes' do
|
247
|
+
before(:each) do
|
248
|
+
@record = mock_record({:category => ['Images', 'Videos'], :creator => 'Federico', :object_url => nil, :source => nil})
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'fetches values from multiple attributes' do
|
252
|
+
@c.attribute(@record, [:category, :creator]).should eq %{<p><strong>Category: </strong>Images, Videos, Federico</p>}
|
253
|
+
end
|
254
|
+
|
255
|
+
it 'returns nothing when both values are nil' do
|
256
|
+
@c.attribute(@record, [:object_url, :source], {:link => true}).should be_nil
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
describe '#attribute_link_replacement' do
|
262
|
+
it 'generates a link and replaces the value' do
|
263
|
+
@c.attribute_link_replacement('Images', '/records?i[category]={{value}}').should eq(@c.link_to('Images', '/records?i[category]=Images'))
|
264
|
+
end
|
265
|
+
|
266
|
+
it 'generates a link with the value as text and url' do
|
267
|
+
@c.attribute_link_replacement('http://google.comm/images', true).should eq(@c.link_to('http://google.comm/images', 'http://google.comm/images'))
|
268
|
+
end
|
269
|
+
|
270
|
+
it 'decodes the link_pattern' do
|
271
|
+
@c.attribute_link_replacement('Images', '/records?i[category]=%7B%7Bvalue%7D%7D').should eq(@c.link_to('Images', '/records?i[category]=Images'))
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|