vj-sdk 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/LICENSE +20 -0
- data/README.markdown +0 -0
- data/README.rdoc +7 -0
- data/Rakefile +70 -0
- data/VERSION.yml +4 -0
- data/lib/core_ext/cgi.rb +12 -0
- data/lib/core_ext/hash.rb +52 -0
- data/lib/core_ext/object.rb +15 -0
- data/lib/core_ext/string.rb +11 -0
- data/lib/sdk_connection_harness.rb +101 -0
- data/lib/videojuicer/asset/audio.rb +13 -0
- data/lib/videojuicer/asset/base.rb +80 -0
- data/lib/videojuicer/asset/flash.rb +8 -0
- data/lib/videojuicer/asset/image.rb +10 -0
- data/lib/videojuicer/asset/text.rb +8 -0
- data/lib/videojuicer/asset/video.rb +22 -0
- data/lib/videojuicer/campaign.rb +19 -0
- data/lib/videojuicer/campaign_policy.rb +116 -0
- data/lib/videojuicer/criterion/base.rb +56 -0
- data/lib/videojuicer/criterion/date_range.rb +15 -0
- data/lib/videojuicer/criterion/geolocation.rb +18 -0
- data/lib/videojuicer/criterion/request.rb +15 -0
- data/lib/videojuicer/criterion/time.rb +15 -0
- data/lib/videojuicer/criterion/week_day.rb +20 -0
- data/lib/videojuicer/oauth/multipart_helper.rb +96 -0
- data/lib/videojuicer/oauth/proxy_factory.rb +18 -0
- data/lib/videojuicer/oauth/request_proxy.rb +280 -0
- data/lib/videojuicer/presentation.rb +38 -0
- data/lib/videojuicer/preset.rb +29 -0
- data/lib/videojuicer/promo/base.rb +72 -0
- data/lib/videojuicer/resource/base.rb +175 -0
- data/lib/videojuicer/resource/collection.rb +36 -0
- data/lib/videojuicer/resource/embeddable.rb +30 -0
- data/lib/videojuicer/resource/errors.rb +17 -0
- data/lib/videojuicer/resource/inferrable.rb +141 -0
- data/lib/videojuicer/resource/property_registry.rb +145 -0
- data/lib/videojuicer/resource/relationships/belongs_to.rb +39 -0
- data/lib/videojuicer/resource/types.rb +28 -0
- data/lib/videojuicer/session.rb +74 -0
- data/lib/videojuicer/shared/configurable.rb +103 -0
- data/lib/videojuicer/shared/exceptions.rb +32 -0
- data/lib/videojuicer/user.rb +43 -0
- data/lib/videojuicer.rb +110 -0
- data/spec/assets/audio_spec.rb +25 -0
- data/spec/assets/flash_spec.rb +24 -0
- data/spec/assets/image_spec.rb +25 -0
- data/spec/assets/text_spec.rb +24 -0
- data/spec/assets/video_spec.rb +25 -0
- data/spec/belongs_to_spec.rb +45 -0
- data/spec/campaign_policy_spec.rb +41 -0
- data/spec/campaign_spec.rb +25 -0
- data/spec/collection_spec.rb +31 -0
- data/spec/criterion/date_range_spec.rb +24 -0
- data/spec/criterion/geolocation_spec.rb +23 -0
- data/spec/criterion/request_spec.rb +23 -0
- data/spec/criterion/time_spec.rb +23 -0
- data/spec/criterion/week_day_spec.rb +23 -0
- data/spec/files/audio.mp3 +0 -0
- data/spec/files/empty_file +0 -0
- data/spec/files/flash.swf +0 -0
- data/spec/files/image.jpg +0 -0
- data/spec/files/text.txt +1 -0
- data/spec/files/video.mov +0 -0
- data/spec/helpers/be_equal_to.rb +26 -0
- data/spec/helpers/spec_fixtures.rb +227 -0
- data/spec/helpers/spec_helper.rb +53 -0
- data/spec/presentation_spec.rb +25 -0
- data/spec/preset_spec.rb +30 -0
- data/spec/promos/audio_spec.rb +23 -0
- data/spec/promos/image_spec.rb +24 -0
- data/spec/promos/text_spec.rb +23 -0
- data/spec/promos/video_spec.rb +23 -0
- data/spec/property_registry_spec.rb +130 -0
- data/spec/request_proxy_spec.rb +90 -0
- data/spec/session_spec.rb +98 -0
- data/spec/shared/asset_spec.rb +39 -0
- data/spec/shared/configurable_spec.rb +75 -0
- data/spec/shared/dependent_spec.rb +40 -0
- data/spec/shared/embeddable_spec.rb +34 -0
- data/spec/shared/model_spec.rb +74 -0
- data/spec/shared/resource_spec.rb +140 -0
- data/spec/spec.opts +3 -0
- data/spec/user_spec.rb +42 -0
- data/spec/videojuicer_spec.rb +122 -0
- data/tasks/vj-core.rb +72 -0
- data/vj-sdk.gemspec +168 -0
- metadata +209 -0
@@ -0,0 +1,103 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
Configurable is a mixin intended for internal use within the SDK.
|
4
|
+
|
5
|
+
It provides a suite of helper methods to objects that use the scoped configuration
|
6
|
+
system within the root Videojuicer module.
|
7
|
+
|
8
|
+
Objects that are Configurable have a local configuration, which will always be
|
9
|
+
respected, and a shared configuration object which merges the current configuration
|
10
|
+
scope with the local configuration.
|
11
|
+
|
12
|
+
For instance:
|
13
|
+
|
14
|
+
# Assuming that the Videojuicer default configuration is a simple hash containing {:in_a_scope=>false}
|
15
|
+
|
16
|
+
a_configurable.configure! :foo=>"bar" # config[:foo] will ALWAYS == "bar" for this object.
|
17
|
+
a_configurable.local_config #=> {:foo=>"bar"}
|
18
|
+
a_configurable.config #=> {:in_a_scope=>false, :foo=>"bar"}
|
19
|
+
|
20
|
+
# Now let's enter a scope:
|
21
|
+
Videojuicer.enter_scope :in_a_scope=>true, :foo=>"not bar"
|
22
|
+
|
23
|
+
a_configurable.local_config #=> {:foo=>"bar"}
|
24
|
+
a_configurable.config #=> {:in_a_scope=>true, :foo=>"bar"}
|
25
|
+
|
26
|
+
# And leave it again..
|
27
|
+
Videojuicer.exit_scope
|
28
|
+
|
29
|
+
a_configurable.local_config #=> {:foo=>"bar"}
|
30
|
+
a_configurable.config #=> {:in_a_scope=>false, :foo=>"bar"}
|
31
|
+
|
32
|
+
=end
|
33
|
+
|
34
|
+
module Videojuicer
|
35
|
+
module Configurable
|
36
|
+
|
37
|
+
attr_accessor :local_config
|
38
|
+
|
39
|
+
# Sets the local configuration for this Configurable.
|
40
|
+
# The local configuration will always be respected regardless of the
|
41
|
+
# current controller scope.
|
42
|
+
def configure!(options={})
|
43
|
+
self.local_config = options
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns the shared configuration, which is the current
|
47
|
+
# controller scope merged with the local config.
|
48
|
+
def config
|
49
|
+
Videojuicer.current_scope.merge(local_config || {})
|
50
|
+
end
|
51
|
+
|
52
|
+
# Executes a block of code within the scope of this Configurable's
|
53
|
+
# local configuration.
|
54
|
+
#
|
55
|
+
# This is achieved by pushing the local configuration onto the controller's
|
56
|
+
# scope stack, executing the given block and then exiting the scope. During
|
57
|
+
# this procedure the local configuration on this object will remain unchanged.
|
58
|
+
#
|
59
|
+
# Example:
|
60
|
+
# Videojuicer.configure! :bar=>"baz"
|
61
|
+
# configurable_a.configure! :foo=>"a"
|
62
|
+
# configurable_b.configure! :foo=>"b"
|
63
|
+
#
|
64
|
+
# configurable_a.scope do |config|
|
65
|
+
# config[:bar] #=> "baz"
|
66
|
+
# config[:foo] #=> "a"
|
67
|
+
#
|
68
|
+
# configurable_b.scope do |config|
|
69
|
+
# config[:foo] #=> "b"
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# config[:foo] #=> "a"
|
73
|
+
# end
|
74
|
+
def scope(&block)
|
75
|
+
Videojuicer.enter_scope local_config
|
76
|
+
block_out = block.call(Videojuicer.current_scope)
|
77
|
+
Videojuicer.exit_scope
|
78
|
+
return block_out
|
79
|
+
end
|
80
|
+
|
81
|
+
# Retrieves the host from the configuration options.
|
82
|
+
def host; config[:host]; end
|
83
|
+
# Retrieves the port from the configuration options.
|
84
|
+
def port; config[:port]; end
|
85
|
+
# Retrieves the consumer_key from the configuration options.
|
86
|
+
def consumer_key; config[:consumer_key]; end
|
87
|
+
# Retrieves the consumer_secret from the configuration options.
|
88
|
+
def consumer_secret; config[:consumer_secret]; end
|
89
|
+
# Retrieves the token from the configuration options.
|
90
|
+
def token; config[:token]; end
|
91
|
+
# Retrieves the token_secret from the configuration options.
|
92
|
+
def token_secret; config[:token_secret]; end
|
93
|
+
# Retrieves the api_version from the configuration options.
|
94
|
+
def api_version; config[:api_version]; end
|
95
|
+
# Retrieves the protocol from the configuration options.
|
96
|
+
def protocol; config[:protocol]; end
|
97
|
+
# Retrieves the seed name from the configuration options.
|
98
|
+
def seed_name; config[:seed_name]; end
|
99
|
+
# Retrieves the user_id from the configuration options. Master tokens can be used to authenticate as any user.
|
100
|
+
def user_id; config[:user_id]; end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Videojuicer
|
2
|
+
module Exceptions
|
3
|
+
|
4
|
+
class NotAuthorised < ::StandardError; end
|
5
|
+
|
6
|
+
# Raised when a method requiring instance-specific data from the remote API
|
7
|
+
# is called on an object that does not exist remotely.
|
8
|
+
class NoResource < ::RuntimeError; end
|
9
|
+
|
10
|
+
# Raised when a record cannot be saved because it has attributes that are well rubbish.
|
11
|
+
class InvalidRecord < ::RuntimeError; end
|
12
|
+
|
13
|
+
# Raised when a request is completely buggered by the remote API.
|
14
|
+
class RemoteApplicationError < ::StandardError; end
|
15
|
+
|
16
|
+
# Raised when the remote resource refuses to carry out an action.
|
17
|
+
class Forbidden < ::StandardError; end
|
18
|
+
|
19
|
+
# Raised when status is 401
|
20
|
+
class Unauthenticated < ::StandardError; end
|
21
|
+
|
22
|
+
# Raised when status is 406
|
23
|
+
class NotAcceptable < ::StandardError; end
|
24
|
+
|
25
|
+
# Raised when status is 411
|
26
|
+
class ContentLengthRequired < ::StandardError; end
|
27
|
+
|
28
|
+
# Raised on an unclassified exception
|
29
|
+
class UnhandledHTTPStatus < ::StandardError; end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Videojuicer
|
2
|
+
class User
|
3
|
+
include Videojuicer::Resource
|
4
|
+
include Videojuicer::Exceptions
|
5
|
+
|
6
|
+
property :name, String
|
7
|
+
property :login, String
|
8
|
+
property :email, String
|
9
|
+
property :password, String
|
10
|
+
property :password_confirmation, String
|
11
|
+
property :created_at, DateTime
|
12
|
+
property :updated_at, DateTime
|
13
|
+
|
14
|
+
# Authenticates the given login and password and returns
|
15
|
+
# a user if the details are correct. Requires a Master token.
|
16
|
+
def self.authenticate(login, password)
|
17
|
+
proxy = Videojuicer::OAuth::RequestProxy.new
|
18
|
+
begin
|
19
|
+
jobj = JSON.parse(proxy.get("/users/authenticate.json", :login=>login, :password=>password).body)
|
20
|
+
o = new(:id=>jobj["id"])
|
21
|
+
o.reload
|
22
|
+
return o
|
23
|
+
rescue NoResource =>e
|
24
|
+
return nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Manage virtual attributes that are not sent back to the API
|
29
|
+
attr_accessor :roles
|
30
|
+
def has_role?(symbol)
|
31
|
+
roles.include?(symbol.to_s)
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_role(*symbols)
|
35
|
+
symbols.each {|r| proxy_for(config).post(resource_path(:add_role), :role=>r) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def remove_role(*symbols)
|
39
|
+
symbols.each {|r| proxy_for(config).post(resource_path(:remove_role), :role=>r) }
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
data/lib/videojuicer.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__) # For use/testing when no gem is installed
|
2
|
+
|
3
|
+
# Gem and stdlib dependencies
|
4
|
+
require 'rubygems'
|
5
|
+
require 'cgi'
|
6
|
+
require 'json'
|
7
|
+
require 'hmac-sha1'
|
8
|
+
require 'net/http'
|
9
|
+
|
10
|
+
# Core ext
|
11
|
+
require 'core_ext/hash'
|
12
|
+
require 'core_ext/string'
|
13
|
+
require 'core_ext/object'
|
14
|
+
require 'core_ext/cgi'
|
15
|
+
# Core mixins
|
16
|
+
require 'videojuicer/shared/exceptions'
|
17
|
+
require 'videojuicer/shared/configurable'
|
18
|
+
# Authentication and authorisation
|
19
|
+
require 'videojuicer/oauth/request_proxy'
|
20
|
+
require 'videojuicer/oauth/proxy_factory'
|
21
|
+
# Resource handling
|
22
|
+
require 'videojuicer/resource/embeddable'
|
23
|
+
require 'videojuicer/resource/types'
|
24
|
+
require 'videojuicer/resource/relationships/belongs_to'
|
25
|
+
require 'videojuicer/resource/errors'
|
26
|
+
require 'videojuicer/resource/collection'
|
27
|
+
require 'videojuicer/resource/inferrable'
|
28
|
+
require 'videojuicer/resource/property_registry'
|
29
|
+
require 'videojuicer/resource/base'
|
30
|
+
require 'videojuicer/session'
|
31
|
+
# Frontend models
|
32
|
+
require 'videojuicer/user'
|
33
|
+
require 'videojuicer/campaign'
|
34
|
+
require 'videojuicer/campaign_policy'
|
35
|
+
require 'videojuicer/presentation'
|
36
|
+
require 'videojuicer/asset/audio'
|
37
|
+
require 'videojuicer/asset/flash'
|
38
|
+
require 'videojuicer/asset/image'
|
39
|
+
require 'videojuicer/asset/text'
|
40
|
+
require 'videojuicer/asset/video'
|
41
|
+
require 'videojuicer/promo/base'
|
42
|
+
require 'videojuicer/criterion/date_range'
|
43
|
+
require 'videojuicer/criterion/geolocation'
|
44
|
+
require 'videojuicer/criterion/request'
|
45
|
+
require 'videojuicer/criterion/time'
|
46
|
+
require 'videojuicer/criterion/week_day'
|
47
|
+
require 'videojuicer/promo/base'
|
48
|
+
require 'videojuicer/preset'
|
49
|
+
|
50
|
+
module Videojuicer
|
51
|
+
|
52
|
+
DEFAULTS = {
|
53
|
+
:consumer_key => nil,
|
54
|
+
:consumer_secret => nil,
|
55
|
+
:token => nil,
|
56
|
+
:token_secret => nil,
|
57
|
+
:api_version => nil,
|
58
|
+
:seed_name => nil,
|
59
|
+
:user_id => nil,
|
60
|
+
:protocol => "http",
|
61
|
+
:host => "api.videojuicer.com",
|
62
|
+
:port => 80
|
63
|
+
}.freeze
|
64
|
+
|
65
|
+
@default_options = {}
|
66
|
+
@scope_stack = []
|
67
|
+
|
68
|
+
class << self
|
69
|
+
|
70
|
+
def scopes
|
71
|
+
([default_options]+@scope_stack).compact
|
72
|
+
end
|
73
|
+
|
74
|
+
def in_scope?
|
75
|
+
!@scope_stack.empty?
|
76
|
+
end
|
77
|
+
|
78
|
+
def current_scope
|
79
|
+
scopes.last
|
80
|
+
end
|
81
|
+
|
82
|
+
def enter_scope(config)
|
83
|
+
@scope_stack.push current_scope.merge(config)
|
84
|
+
end
|
85
|
+
|
86
|
+
def exit_scope
|
87
|
+
@scope_stack.pop
|
88
|
+
end
|
89
|
+
|
90
|
+
def exit_all!
|
91
|
+
@scope_stack = []
|
92
|
+
end
|
93
|
+
|
94
|
+
def [](key)
|
95
|
+
@default_options[key]
|
96
|
+
end
|
97
|
+
|
98
|
+
def configure!(options={})
|
99
|
+
@default_options = DEFAULTS.merge(@default_options.merge(options))
|
100
|
+
end
|
101
|
+
|
102
|
+
def unconfigure!
|
103
|
+
@default_options = DEFAULTS
|
104
|
+
end
|
105
|
+
|
106
|
+
def default_options
|
107
|
+
@default_options
|
108
|
+
end
|
109
|
+
end # class << self
|
110
|
+
end # module Videojuicer
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Asset::Audio do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Asset::Audio
|
7
|
+
@preset_params = {:derived_type => "Audio", :file_format => "mp3"}
|
8
|
+
configure_test_settings
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "instantiation" do
|
12
|
+
it_should_behave_like "a configurable"
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "general interface:" do
|
16
|
+
before(:all) do
|
17
|
+
@singular_name = "asset"
|
18
|
+
@plural_name = "assets/audio"
|
19
|
+
end
|
20
|
+
|
21
|
+
it_should_behave_like "a RESTFUL resource model"
|
22
|
+
end
|
23
|
+
|
24
|
+
it_should_behave_like "an asset"
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Asset::Flash do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Asset::Flash
|
7
|
+
configure_test_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "instantiation" do
|
11
|
+
it_should_behave_like "a configurable"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "general interface:" do
|
15
|
+
before(:all) do
|
16
|
+
@singular_name = "asset"
|
17
|
+
@plural_name = "assets/flash"
|
18
|
+
end
|
19
|
+
|
20
|
+
it_should_behave_like "a RESTFUL resource model"
|
21
|
+
end
|
22
|
+
|
23
|
+
it_should_behave_like "an asset"
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Asset::Image do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Asset::Image
|
7
|
+
@preset_params = {:derived_type => "Image", :file_format => "png"}
|
8
|
+
configure_test_settings
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "instantiation" do
|
12
|
+
it_should_behave_like "a configurable"
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "general interface:" do
|
16
|
+
before(:all) do
|
17
|
+
@singular_name = "asset"
|
18
|
+
@plural_name = "assets/image"
|
19
|
+
end
|
20
|
+
|
21
|
+
it_should_behave_like "a RESTFUL resource model"
|
22
|
+
end
|
23
|
+
|
24
|
+
it_should_behave_like "an asset"
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Asset::Text do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Asset::Text
|
7
|
+
configure_test_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "instantiation" do
|
11
|
+
it_should_behave_like "a configurable"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "general interface:" do
|
15
|
+
before(:all) do
|
16
|
+
@singular_name = "asset"
|
17
|
+
@plural_name = "assets/text"
|
18
|
+
end
|
19
|
+
|
20
|
+
it_should_behave_like "a RESTFUL resource model"
|
21
|
+
end
|
22
|
+
|
23
|
+
it_should_behave_like "an asset"
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Asset::Video do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Asset::Video
|
7
|
+
@preset_params = {:derived_type => "Video", :file_format => "mp4"}
|
8
|
+
configure_test_settings
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "instantiation" do
|
12
|
+
it_should_behave_like "a configurable"
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "general interface:" do
|
16
|
+
before(:all) do
|
17
|
+
@singular_name = "asset"
|
18
|
+
@plural_name = "assets/video"
|
19
|
+
end
|
20
|
+
|
21
|
+
it_should_behave_like "a RESTFUL resource model"
|
22
|
+
end
|
23
|
+
|
24
|
+
it_should_behave_like "an asset"
|
25
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Resource::Relationships::BelongsTo do
|
4
|
+
|
5
|
+
after(:all) do
|
6
|
+
Videojuicer.exit_scope
|
7
|
+
end
|
8
|
+
|
9
|
+
before(:all) do
|
10
|
+
configure_test_settings
|
11
|
+
Videojuicer.enter_scope :seed_name => fixtures.seed.name,
|
12
|
+
:consumer_key=>fixtures["write-master"].consumer.consumer_key,
|
13
|
+
:consumer_secret=>fixtures["write-master"].consumer.consumer_secret,
|
14
|
+
:token=>fixtures["write-master"].authorized_token.oauth_token,
|
15
|
+
:token_secret=>fixtures["write-master"].authorized_token.oauth_token_secret
|
16
|
+
|
17
|
+
@user = Videojuicer::User.first
|
18
|
+
@user.should be_kind_of(Videojuicer::User)
|
19
|
+
|
20
|
+
class ::BelongsToExample
|
21
|
+
include Videojuicer::Resource
|
22
|
+
|
23
|
+
property :user_id, Integer
|
24
|
+
belongs_to :user, :class=>Videojuicer::User
|
25
|
+
end
|
26
|
+
|
27
|
+
@example = ::BelongsToExample.new
|
28
|
+
@example.user_id = @user.id
|
29
|
+
end
|
30
|
+
|
31
|
+
it "retrieves the user" do
|
32
|
+
@example.user.id.should == @user.id
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns nil when the user_id is nonsense" do
|
36
|
+
bad_example = ::BelongsToExample.new(:user_id=>9900000000)
|
37
|
+
bad_example.user.should be_nil
|
38
|
+
end
|
39
|
+
|
40
|
+
it "sets the user" do
|
41
|
+
@example.user = @user
|
42
|
+
@example.user_id.should == @user.id
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Campaign::CampaignPolicy do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Campaign::CampaignPolicy
|
7
|
+
configure_test_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "instantiation" do
|
11
|
+
it_should_behave_like "a configurable"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "general interface:" do
|
15
|
+
before(:all) do
|
16
|
+
@singular_name = "campaign_policy"
|
17
|
+
@plural_name = "campaign_policies"
|
18
|
+
@fixed_attributes = [:campaign_id]
|
19
|
+
end
|
20
|
+
|
21
|
+
it_should_behave_like "a RESTFUL resource model"
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "adding policies" do
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "removing policies" do
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "adding promos" do
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "removing promos" do
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Campaign do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Campaign
|
7
|
+
configure_test_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "instantiation" do
|
11
|
+
it_should_behave_like "a configurable"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "general interface:" do
|
15
|
+
before(:all) do
|
16
|
+
string_mash = (("A".."z").to_a + ("a".."z").to_a)
|
17
|
+
@singular_name = "campaign"
|
18
|
+
@plural_name = "campaigns"
|
19
|
+
end
|
20
|
+
|
21
|
+
it_should_behave_like "a RESTFUL resource model"
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Resource::Collection do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@objects = [:foo]*100
|
7
|
+
@collection = Videojuicer::Resource::Collection.new(@objects[0..9], 155, 17, 10)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "is instantiated correctly" do
|
11
|
+
@collection.should be_kind_of(Videojuicer::Resource::Collection)
|
12
|
+
@collection.total.should == 155
|
13
|
+
@collection.offset.should == 17
|
14
|
+
@collection.limit.should == 10
|
15
|
+
end
|
16
|
+
|
17
|
+
it "can count the number of pages" do
|
18
|
+
@collection.page_count.should == 16
|
19
|
+
end
|
20
|
+
|
21
|
+
it "can tell the current page" do
|
22
|
+
@collection.page_number.should == 2
|
23
|
+
end
|
24
|
+
|
25
|
+
it "pagination copes with a nil limit" do
|
26
|
+
collection = Videojuicer::Resource::Collection.new(@objects[0..9], 155, 17, nil)
|
27
|
+
collection.page_count.should == 1
|
28
|
+
collection.page_number.should == 1
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Criterion::DateRange do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Criterion::DateRange
|
7
|
+
configure_test_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "instantiation" do
|
11
|
+
it_should_behave_like "a configurable"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "general interface:" do
|
15
|
+
before(:all) do
|
16
|
+
@singular_name = "criterion"
|
17
|
+
@plural_name = "criteria/date_range"
|
18
|
+
end
|
19
|
+
|
20
|
+
it_should_behave_like "a dependent non-resource object"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Criterion::Geolocation do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Criterion::Geolocation
|
7
|
+
configure_test_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "instantiation" do
|
11
|
+
it_should_behave_like "a configurable"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "general interface:" do
|
15
|
+
before(:all) do
|
16
|
+
@singular_name = "criterion"
|
17
|
+
@plural_name = "criteria/geolocation"
|
18
|
+
end
|
19
|
+
|
20
|
+
it_should_behave_like "a dependent non-resource object"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Criterion::Request do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Criterion::Request
|
7
|
+
configure_test_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "instantiation" do
|
11
|
+
it_should_behave_like "a configurable"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "general interface:" do
|
15
|
+
before(:all) do
|
16
|
+
@singular_name = "criterion"
|
17
|
+
@plural_name = "criteria/request"
|
18
|
+
end
|
19
|
+
|
20
|
+
it_should_behave_like "a dependent non-resource object"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Criterion::Time do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Criterion::Time
|
7
|
+
configure_test_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "instantiation" do
|
11
|
+
it_should_behave_like "a configurable"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "general interface:" do
|
15
|
+
before(:all) do
|
16
|
+
@singular_name = "criterion"
|
17
|
+
@plural_name = "criteria/time"
|
18
|
+
end
|
19
|
+
|
20
|
+
it_should_behave_like "a dependent non-resource object"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "helpers", "spec_helper")
|
2
|
+
|
3
|
+
describe Videojuicer::Criterion::WeekDay do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@klass = Videojuicer::Criterion::WeekDay
|
7
|
+
configure_test_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "instantiation" do
|
11
|
+
it_should_behave_like "a configurable"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "general interface:" do
|
15
|
+
before(:all) do
|
16
|
+
@singular_name = "criterion"
|
17
|
+
@plural_name = "criteria/week_day"
|
18
|
+
end
|
19
|
+
|
20
|
+
it_should_behave_like "a dependent non-resource object"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
Binary file
|
File without changes
|