queue_it 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 80302e4595250a93745ae5cdde295cc1ef9c4dfe
4
- data.tar.gz: 98f55674bca1f8d64ea1ea35b3cc0f9f14096cd5
3
+ metadata.gz: 8150d61b7d0ab15e25a4f0fab5c03c467971e3d2
4
+ data.tar.gz: 973591f75fa2065da623ffdde2ba528988d6c6c3
5
5
  SHA512:
6
- metadata.gz: 734e01bc853574e3e963c60212debdc7ce9ea33e87cdb2d6b9619d7aecef8de31994a8aa7c2559935478ee0bae6a8825ecdcce1b3cc0ea90169ede943c798535
7
- data.tar.gz: f86d410b4b320462e8aaa82c702ac1c1ef6eb700ec00117f212e9b2a132ef51d825cc734d52445544e7ccb4e9b21eb6c6766c806d2ba1e22e8696d4bb4c1755e
6
+ metadata.gz: 64388a8c6c1491f80164f130450363fe307145857cef71fb4980c5ea9e7b6d378364649d149ad0d3d24706fae84b9ef2732039c14ac66213e106758da9eefb8f
7
+ data.tar.gz: caf23fffccda918e9f8c0f1dad37cd48b714c507d24afb43dc136d58830848bac51686a704820b888856b31d7e426197df28ce9114c20550d41ab6eca65a47d5
data/CHANGELOG.md ADDED
@@ -0,0 +1,18 @@
1
+ ### 1.1.0 - 2015-05-07
2
+
3
+ * Basic Api 2.0.beta integration
4
+ * https://api2.queue-it.net
5
+ * `QueueIt::Api::Client`
6
+ * Allows to perform request with `JSON` encoded data to proper endpoint
7
+ * Debugging mode present
8
+ * `QueueIt::Api::Event`
9
+ * Creates or updates queue with some basic setup which fits our current needs
10
+ * Sets queue speed
11
+
12
+ ### 1.0.0 - 2014-11-06
13
+
14
+ * Provides `#protect_with_queue!` method
15
+ * renders page which allows to redirect users to Queue-It
16
+ * handles KnowUserSecretKey verification
17
+ * Provides `#destroy_all_queue_it_sessions` method
18
+ * clears queue which pushes client from queue after successful purchase
data/README.md CHANGED
@@ -24,7 +24,7 @@ $ gem install queue_it
24
24
 
25
25
  ## Usage
26
26
 
27
- We are using Queue-it on http://billetto.co.ok, and we create our queued events like this:
27
+ We are using Queue-it on http://billetto.co.uk, and we create our queued events like this:
28
28
 
29
29
  ```ruby
30
30
  event = create(:event,
@@ -74,6 +74,92 @@ class EventsController < ApplicationController
74
74
  end
75
75
  ```
76
76
 
77
+ ### API
78
+ #### Client
79
+
80
+ Initialize client to pass it as a dependency to `Event` instance.
81
+
82
+ ``` ruby
83
+ client = QueueIt::Api::Client.new(api_key: "SECRET_API_KEY")
84
+ ```
85
+
86
+ #### Event
87
+ ##### #create_or_update
88
+ Handles: https://api2.queue-it.net/Help/Api/PUT-2_0_beta-event-eventId
89
+
90
+ Basic usage
91
+ ``` ruby
92
+ event = QueueIt::Api::Event.new(client)
93
+
94
+ event.create_or_update(event_id: 'justatestevent',
95
+ display_name: "Test event",
96
+ start_time: Time.now,
97
+ redirect_url: 'https://example.com/en/events/not-so-fancy-event/tickets')
98
+ # produces
99
+ {
100
+ "QueueUrl"=>"http://justatestevent-examplecom.queue-it.net/?c=examplecom&e=justatestevent",
101
+ "EventId"=>"justatestevent",
102
+ "PreQueueStartLocalTime"=>"2015-05-07T13:29:00.0000000Z",
103
+ "EventStartLocalTime"=>"2015-05-07T14:29:00.0000000Z",
104
+ "EventEndLocalTime"=>"2016-05-06T19:29:00.0000000Z",
105
+ "QueueStatus"=>"Running",
106
+ "LastPassedAutoTestRun"=>"",
107
+ "DisplayName"=>"Test event",
108
+ "RedirectUrl"=>"https://example.com/en/events/not-so-fancy-event/tickets",
109
+ "Description"=>"",
110
+ "TimeZone"=>"UTC",
111
+ "PreQueueStartTime"=>"2015-05-07T13:29:00.0000000Z",
112
+ "EventStartTime"=>"2015-05-07T14:29:00.0000000Z",
113
+ "EventEndTime"=>"2016-05-06T20:29:00.0000000Z",
114
+ "EventCulture"=>"en-US",
115
+ "MaxNoOfRedirectsPrQueueId"=>"1",
116
+ "QueueNumberValidityInMinutes"=>"15",
117
+ "AfterEventLogic"=>"RedirectUsersToTargetPage",
118
+ "AfterEventRedirectPage"=>"",
119
+ "UseSSL"=>"Auto",
120
+ "JavaScriptSupportEnabled"=>"False",
121
+ "TargetUrlSupportEnabled"=>"False",
122
+ "SafetyNetMode"=>"Disabled",
123
+ "KnowUserSecurity"=>"MD5Hash",
124
+ "KnowUserSecretKey"=>"SECRET",
125
+ "CustomLayout"=>"Default layout by Queue-it",
126
+ "XUsersInFrontOfYou"=>"0",
127
+ "TargetUrlValidationRegex"=>"",
128
+ "DomainAlias"=>"justatestevent-examplecom.queue-it.net",
129
+ "AllowedCustomLayouts"=>[],
130
+ "BrowserCultureEnabled"=>"True",
131
+ "IdleQueueLogic"=>"UseBeforePage",
132
+ "IdleQueueRedirectPage"=>""
133
+ }
134
+ ```
135
+
136
+ Available named attributes
137
+ ``` ruby
138
+ event_id:
139
+ display_name:
140
+ start_time:
141
+ end_time:
142
+ know_user_secret_key:
143
+ redirect_url:
144
+ description:
145
+ max_redirects_per_minute:
146
+ event_culture_name:
147
+ time_zone:
148
+ queue_number_validity_in_minutes:
149
+ ```
150
+
151
+ ##### #set_speed
152
+
153
+ Set redirect speed on an event queue.
154
+
155
+ See: https://api2.queue-it.net/Help/Api/PUT-2_0_beta-event-eventId-queue-speed
156
+
157
+ ``` ruby
158
+ event = QueueIt::Api::Event.new(client)
159
+
160
+ event.set_speed(event_id: "justatestevent", max_redirects_per_minute: 15)
161
+ ```
162
+
77
163
  ## Contributing
78
164
 
79
165
  1. Fork it
@@ -0,0 +1,48 @@
1
+ require 'faraday'
2
+ require 'json'
3
+
4
+ module FaradayMiddleware
5
+ class RaiseHttpException < Faraday::Middleware
6
+ def call(env)
7
+ @app.call(env).on_complete do |response|
8
+ case response[:status].to_i
9
+ when 400
10
+ raise QueueIt::Api::BadRequest.new(response.body, error_details(response))
11
+ when 403
12
+ raise QueueIt::Api::Forbidden.new(response.body, error_details(response))
13
+ when 404
14
+ raise QueueIt::Api::NotFound.new(response.body, error_details(response))
15
+ when 500
16
+ raise QueueIt::Api::InternalServerError.new(response.body, error_details(response))
17
+ when 503
18
+ raise QueueIt::Api::ServiceUnavailable.new(response.body, error_details(response))
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def error_response_body(code, text)
26
+ { "ErrorCode" => code, "ErrorText" => text }
27
+ end
28
+
29
+ def acts_like_json?(response_body)
30
+ !response_body.nil? && !response_body.empty? && response_body.kind_of?(String)
31
+ end
32
+
33
+ def parse_json(body)
34
+ JSON.parse(body)
35
+ rescue JSON::ParserError
36
+ error_response_body(nil, body)
37
+ end
38
+
39
+ def parse_body(response_body)
40
+ acts_like_json?(response_body) ? parse_json(response_body) : error_response_body(nil, nil)
41
+ end
42
+
43
+ def error_details(response)
44
+ response_body = parse_body(response.body)
45
+ { status: response[:status].to_i, code: response_body["ErrorCode"], text: response_body["ErrorText"] }
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,53 @@
1
+ require 'uri'
2
+ require 'faraday'
3
+ require 'faraday_middleware'
4
+ require 'faraday/raise_http_exception'
5
+ require 'queue_it/api/error'
6
+
7
+ module QueueIt
8
+ module Api
9
+ class Client
10
+ JSON_FORMAT = "application/json".freeze
11
+ ENDPOINT_URL = URI("https://api2.queue-it.net/2_0_beta/event").freeze
12
+
13
+ def initialize(api_key: api_key, debug: false)
14
+ self.api_key = api_key
15
+ self.debug = debug
16
+ end
17
+
18
+ def put(path, body)
19
+ connection.put(path, body)
20
+ end
21
+
22
+ private
23
+
24
+ attr_accessor :api_key, :debug
25
+
26
+ def options
27
+ {
28
+ url: ENDPOINT_URL.dup,
29
+ headers: {
30
+ accept: JSON_FORMAT,
31
+ content_type: JSON_FORMAT,
32
+ "Api-Key" => api_key,
33
+ },
34
+ }
35
+ end
36
+
37
+ def debug?
38
+ debug
39
+ end
40
+
41
+ def connection
42
+ @connection ||= Faraday.new(options) do |builder|
43
+ builder.request :json
44
+ builder.response :logger, nil, { bodies: true } if debug?
45
+ builder.response :json, content_type: /\bjson$/
46
+
47
+ builder.adapter Faraday.default_adapter
48
+ builder.use FaradayMiddleware::RaiseHttpException
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,20 @@
1
+ module QueueIt
2
+ module Api
3
+ class Error < StandardError
4
+ attr_accessor :status, :code, :text
5
+
6
+ def initialize(msg = nil, status: nil, code: nil, text: nil)
7
+ self.code = code
8
+ self.text = text
9
+ self.status = status
10
+ super(msg)
11
+ end
12
+ end
13
+
14
+ BadRequest = Class.new(Error)
15
+ Forbidden = Class.new(Error)
16
+ NotFound = Class.new(Error)
17
+ InternalServerError = Class.new(Error)
18
+ ServiceUnavailable = Class.new(Error)
19
+ end
20
+ end
@@ -0,0 +1,121 @@
1
+ require 'json'
2
+ require 'uri'
3
+ require 'time'
4
+
5
+ module QueueIt
6
+ module Api
7
+ class Event
8
+ InvalidEventIdFormat = Class.new(StandardError)
9
+
10
+ def initialize(client)
11
+ self.client = client
12
+ end
13
+
14
+ def create_or_update(event_id:, display_name:, start_time:, know_user_secret_key: nil, redirect_url:, end_time: nil, description: "", event_culture_name: "en-US", time_zone: "UTC", queue_number_validity_in_minutes: 15)
15
+ raise InvalidEventIdFormat unless valid_event_id_format?(event_id)
16
+
17
+ attributes = queue_attributes(
18
+ start_time: start_time,
19
+ end_time: end_time,
20
+ know_user_secret_key: know_user_secret_key,
21
+ redirect_url: redirect_url,
22
+ description: description,
23
+ display_name: display_name,
24
+ event_culture_name: event_culture_name,
25
+ queue_number_validity_in_minutes: queue_number_validity_in_minutes,
26
+ time_zone: time_zone)
27
+
28
+ perform_request(:put, event_id, attributes)
29
+ end
30
+
31
+ def set_speed(event_id:, max_redirects_per_minute:)
32
+ raise InvalidEventIdFormat unless valid_event_id_format?(event_id)
33
+
34
+ number_of_redirects = [max_redirects_per_minute.to_i, QUEUE_IT_MINIMAL_NUMBER_OF_REDIRECTS_PER_MINUTE].max
35
+ attributes = { "MaxRedirectsPerMinute" => "#{number_of_redirects}" }
36
+
37
+ perform_request(:put, "#{event_id}/queue/speed", attributes)
38
+ end
39
+
40
+ private
41
+
42
+ attr_accessor :client
43
+
44
+ ONE_YEAR = 31557600
45
+ ONE_HOUR = 3600
46
+
47
+ MICROSOFT_TIME_ZONE_INDEX_VALUES = {
48
+ "Europe/Copenhagen" => "Romance Standard Time",
49
+ "Europe/Helsinki" => "FLE Standard Time",
50
+ "Europe/London" => "GMT Standard Time",
51
+ "Europe/Paris" => "GMT Standard Time",
52
+ "Paris" => "Romance Standard Time",
53
+ "Stockholm" => "W. Europe Standard Time",
54
+ }.freeze
55
+
56
+ EVENT_ID_FORMAT = /\A[a-zA-z0-9]{1,20}\z/.freeze
57
+ QUEUE_IT_ISO8601_TIME_PRECISION = 7
58
+ QUEUE_IT_MINIMAL_NUMBER_OF_REDIRECTS_PER_MINUTE = 5
59
+
60
+ def valid_event_id_format?(event_id)
61
+ "#{event_id}".match(EVENT_ID_FORMAT)
62
+ end
63
+
64
+ def utc_start_time(start_time)
65
+ start_time.utc
66
+ end
67
+
68
+ def utc_end_time(start_time, end_time)
69
+ end_time && end_time.utc || utc_start_time(start_time) + ONE_YEAR
70
+ end
71
+
72
+ def pre_queue_start_time(start_time)
73
+ start_time.utc - ONE_HOUR
74
+ end
75
+
76
+ def format_time(time)
77
+ time.iso8601(QUEUE_IT_ISO8601_TIME_PRECISION)
78
+ end
79
+
80
+ def translate_time_zone(time_zone)
81
+ MICROSOFT_TIME_ZONE_INDEX_VALUES.fetch(time_zone, time_zone)
82
+ end
83
+
84
+ def queue_attributes(start_time:, end_time:, know_user_secret_key:, redirect_url:, description:, display_name:, event_culture_name:, queue_number_validity_in_minutes:, time_zone:)
85
+ {
86
+ "DisplayName" => display_name,
87
+ "RedirectUrl" => URI(redirect_url).to_s,
88
+ "Description" => description,
89
+ "TimeZone" => translate_time_zone(time_zone),
90
+ "PreQueueStartTime" => format_time( pre_queue_start_time(start_time) ),
91
+ "EventStartTime" => format_time( utc_start_time(start_time) ),
92
+ "EventEndTime" => format_time( utc_end_time(start_time, end_time) ),
93
+ "EventCulture" => event_culture_name,
94
+ "MaxNoOfRedirectsPrQueueId" => "1",
95
+ "QueueNumberValidityInMinutes" => "#{queue_number_validity_in_minutes}",
96
+ "AfterEventLogic" => "RedirectUsersToTargetPage",
97
+ "AfterEventRedirectPage" => "",
98
+ "UseSSL" => "Auto",
99
+ "JavaScriptSupportEnabled" => "False",
100
+ "TargetUrlSupportEnabled" => "False",
101
+ "SafetyNetMode" => "Disabled",
102
+ "KnowUserSecurity" => "MD5Hash",
103
+ "KnowUserSecretKey" => know_user_secret_key,
104
+ "CustomLayout" => "Default layout by Queue-it",
105
+ "XUsersInFrontOfYou" => nil,
106
+ "TargetUrlValidationRegex" => "",
107
+ "DomainAlias" => "",
108
+ "AllowedCustomLayouts" => [],
109
+ "BrowserCultureEnabled" => "True",
110
+ "IdleQueueLogic" => "UseBeforePage",
111
+ "IdleQueueRedirectPage" => ""
112
+ }
113
+ end
114
+
115
+ def perform_request(method, path, body = {})
116
+ json_response = client.public_send(method, path, body)
117
+ json_response.body
118
+ end
119
+ end
120
+ end
121
+ end
@@ -1,3 +1,3 @@
1
1
  module QueueIt
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/queue_it.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require "queue_it/version"
2
2
  require "queue_it/known_user_checker"
3
+ require "queue_it/api/client"
4
+ require "queue_it/api/event"
3
5
 
4
6
  module QueueIt
5
7
  class NotAuthorized < StandardError; end
data/queue_it.gemspec CHANGED
@@ -6,8 +6,8 @@ require 'queue_it/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "queue_it"
8
8
  spec.version = QueueIt::VERSION
9
- spec.authors = ["Kasper Grubbe"]
10
- spec.email = ["kawsper@gmail.com"]
9
+ spec.authors = ["Billetto"]
10
+ spec.email = ["development@billetto.dk"]
11
11
  spec.description = %q{Gem to handle the implementation of http://queue-it.net!}
12
12
  spec.summary = %q{Gem to handle the implementation of http://queue-it.net}
13
13
  spec.homepage = "https://github.com/gfish/queue_it"
@@ -18,8 +18,11 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_runtime_dependency 'addressable'
21
+ spec.add_runtime_dependency "addressable", "~> 2.3"
22
+ spec.add_runtime_dependency "faraday", "~> 0.9"
23
+ spec.add_runtime_dependency "faraday_middleware", "~> 0.9"
22
24
 
23
25
  spec.add_development_dependency "bundler", "~> 1.3"
24
- spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec", "~> 3.2"
27
+ spec.add_development_dependency "webmock", "~> 1.21"
25
28
  end
@@ -0,0 +1,121 @@
1
+ require 'json'
2
+ require 'webmock/rspec'
3
+ require 'queue_it/api/client'
4
+
5
+ module QueueIt
6
+ module Api
7
+ describe Client do
8
+ subject(:client) { described_class.new(api_key: "SECURE_KEY") }
9
+
10
+ specify "PUT data under given endpoint & path in JSON format" do
11
+ request_hash = { "Request" => true }
12
+ response_hash = { "Response" => true }
13
+
14
+ stub_successful_put(request_hash, response_hash)
15
+
16
+ expect( client.put("fancy_event", request_hash).body ).to eq(response_hash)
17
+ end
18
+
19
+ specify "authentication error handling" do
20
+ stub_unauthorized
21
+
22
+ expect{ client.put("fancy_event", {}) }.to raise_error(Forbidden)
23
+ end
24
+
25
+ specify "error details are being parsed" do
26
+ stub_unauthorized
27
+
28
+ begin
29
+ client.put("fancy_event", {})
30
+ rescue Forbidden => e
31
+ expect(e.status).to eq(403)
32
+ expect(e.code).to eq(4000)
33
+ expect(e.text).to eq("Authentication failed. Supply valid API key to access this operation")
34
+ end
35
+ end
36
+
37
+ specify "server error with html body" do
38
+ stub_internal_server_error
39
+
40
+ expect{ client.put("fancy_event", "{}") }.to raise_error(InternalServerError)
41
+ end
42
+
43
+ specify "error without a body" do
44
+ stub_internal_server_error
45
+
46
+ begin
47
+ client.put("fancy_event", "{}")
48
+ rescue InternalServerError => e
49
+ expect(e.status).to eq(500)
50
+ expect(e.code).to be_nil
51
+ expect(e.text).to eq("<html>Internal Server Error<\/html>")
52
+ end
53
+ end
54
+
55
+ specify "bad request error handling" do
56
+ stub_bad_request
57
+
58
+ expect{ client.put("fancy_event", "{}") }.to raise_error(BadRequest)
59
+ end
60
+
61
+ specify "not found error handling" do
62
+ stub_not_found
63
+
64
+ expect{ client.put("fancy_event", "{}") }.to raise_error(NotFound)
65
+ end
66
+
67
+ specify "service unavailable error handling" do
68
+ stub_service_unavailable
69
+
70
+ expect{ client.put("fancy_event", "{}") }.to raise_error(ServiceUnavailable)
71
+ end
72
+
73
+ specify "debugging mode puts to STDOUT" do
74
+ client = Client.new(api_key: "SECURE_KEY", debug: true)
75
+
76
+ request_hash = { "Request" => true }
77
+
78
+ stub_successful_put(request_hash, {})
79
+
80
+ expect { client.put("fancy_event", request_hash) }.to output(/request: {"Request":true}/).to_stdout_from_any_process
81
+ end
82
+
83
+ private
84
+
85
+ def endpoint_url
86
+ Client::ENDPOINT_URL.to_s + "/fancy_event"
87
+ end
88
+
89
+ def stub_request_factory(method: :put, status: 200, request_body: "{}", response_body: "{}", content_type: "application/json")
90
+ stub_request(method, endpoint_url)
91
+ .with(:body => request_body, :headers => {'Accept'=>'application/json', 'Api-Key'=>'SECURE_KEY', 'Content-Type'=>'application/json'})
92
+ .to_return(:status => status, :body => response_body, :headers => { 'Content-Type' => content_type })
93
+ end
94
+
95
+ def stub_unauthorized
96
+ body = "{\"ErrorCode\":4000,\"ErrorText\":\"Authentication failed. Supply valid API key to access this operation\"}"
97
+ stub_request_factory(status: 403, response_body: body)
98
+ end
99
+
100
+ def stub_internal_server_error
101
+ stub_request_factory(status: 500, response_body: "<html>Internal Server Error</html>", content_type: "text/html")
102
+ end
103
+
104
+ def stub_successful_put(request_body, response_body)
105
+ stub_request_factory(request_body: JSON.generate(request_body), response_body: JSON.generate(response_body))
106
+ end
107
+
108
+ def stub_bad_request
109
+ stub_request_factory(status: 400)
110
+ end
111
+
112
+ def stub_not_found
113
+ stub_request_factory(status: 404)
114
+ end
115
+
116
+ def stub_service_unavailable
117
+ stub_request_factory(status: 503)
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,198 @@
1
+ require 'queue_it/api/event'
2
+ require 'queue_it/api/client'
3
+ require 'webmock/rspec'
4
+
5
+ module QueueIt
6
+ module Api
7
+ describe Event do
8
+ let(:event_id) { "fancyevent" }
9
+
10
+ subject(:event_adapter) { Event.new(client) }
11
+
12
+ context "#create_or_update" do
13
+ let(:client) { double(:api_client) }
14
+ let(:know_user_secret_key) { "930f42ca-d9e7-4202-bff4-606e127b1c103980c131-cd8a-4e35-a945-50f7b5102ad6" }
15
+ let(:display_name) { "Fancy Event 2015" }
16
+ let(:description) { "Foo" }
17
+ let(:redirect_url) { "https://example.com/en/events/fancy_event/tickets" }
18
+ let(:time_zone) { "Europe/Copenhagen" }
19
+ let(:event_culture_name) { "en-US" }
20
+ let(:queue_number_validity_in_minutes) { 15 }
21
+
22
+ specify "Submits proper request" do
23
+ expect(client).to receive(:put).with(event_id, valid_create_body).and_return(double(body:{}))
24
+
25
+ event_adapter.create_or_update(event_id: event_id,
26
+ display_name: display_name,
27
+ description: description,
28
+ redirect_url: redirect_url,
29
+ start_time: Time.new(2015,04,28,17,25,46, "+02:00"),
30
+ end_time: Time.new(2015,04,28,21,25,46, "+02:00"),
31
+ event_culture_name: event_culture_name,
32
+ know_user_secret_key: know_user_secret_key,
33
+ queue_number_validity_in_minutes: queue_number_validity_in_minutes)
34
+ end
35
+
36
+ specify "Minimum viable attributes for creating event" do
37
+ body = valid_create_body.merge({
38
+ "Description" => "",
39
+ "EventEndTime" => "2016-04-27T21:25:46.0000000Z",
40
+ "EventCulture" => event_culture_name,
41
+ "KnowUserSecretKey" => nil,
42
+ })
43
+
44
+ expect(client).to receive(:put).with(event_id, body).and_return(double(body:{}))
45
+
46
+ event_adapter.create_or_update(event_id: event_id,
47
+ display_name: display_name,
48
+ redirect_url: redirect_url,
49
+ start_time: Time.utc(2015,04,28,15,25,46),)
50
+ end
51
+
52
+ specify "Set custom time zone in the ruby way" do
53
+ body = valid_create_body.merge({
54
+ "TimeZone" => "Romance Standard Time",
55
+ })
56
+
57
+ expect(client).to receive(:put).with(event_id, body).and_return(double(body:{}))
58
+
59
+ event_adapter.create_or_update(event_id: event_id,
60
+ display_name: display_name,
61
+ description: description,
62
+ redirect_url: redirect_url,
63
+ start_time: Time.new(2015,04,28,17,25,46, "+02:00"),
64
+ end_time: Time.new(2015,04,28,21,25,46, "+02:00"),
65
+ know_user_secret_key: know_user_secret_key,
66
+ queue_number_validity_in_minutes: queue_number_validity_in_minutes,
67
+ time_zone: time_zone,)
68
+ end
69
+
70
+ specify "Event id must have proper format" do
71
+ invalid_event_id = "/fancyevent"
72
+
73
+ expect do
74
+ event_adapter.create_or_update(event_id: invalid_event_id,
75
+ display_name: display_name,
76
+ description: description,
77
+ redirect_url: redirect_url,
78
+ start_time: Time.new(2015,04,28,17,25,46, "+02:00"),
79
+ end_time: Time.new(2015,04,28,21,25,46, "+02:00"),
80
+ know_user_secret_key: know_user_secret_key,
81
+ queue_number_validity_in_minutes: queue_number_validity_in_minutes,
82
+ time_zone: time_zone,)
83
+ end.to raise_error(Event::InvalidEventIdFormat)
84
+ end
85
+
86
+ specify "Event id has to be no longer than 20 characters" do
87
+ too_long_event_id = "fancyeventnametoolong"
88
+
89
+ expect do
90
+ event_adapter.create_or_update(event_id: too_long_event_id,
91
+ display_name: display_name,
92
+ description: description,
93
+ redirect_url: redirect_url,
94
+ start_time: Time.new(2015,04,28,17,25,46, "+02:00"),
95
+ end_time: Time.new(2015,04,28,21,25,46, "+02:00"),
96
+ know_user_secret_key: know_user_secret_key,
97
+ queue_number_validity_in_minutes: queue_number_validity_in_minutes,
98
+ time_zone: time_zone,)
99
+ end.to raise_error(Event::InvalidEventIdFormat)
100
+ end
101
+
102
+ specify "Request hits proper endpoint" do
103
+ client = Client.new(api_key: "SECURE_KEY")
104
+ event_adapter = Event.new(client)
105
+
106
+ body = JSON.generate(valid_create_body)
107
+
108
+ stub = stub_request(:put, "https://api2.queue-it.net/2_0_beta/event/fancyevent")
109
+ .with(body: body, headers: headers)
110
+
111
+ event_adapter.create_or_update(event_id: event_id,
112
+ display_name: display_name,
113
+ description: description,
114
+ redirect_url: redirect_url,
115
+ start_time: Time.new(2015,04,28,17,25,46, "+02:00"),
116
+ end_time: Time.new(2015,04,28,21,25,46, "+02:00"),
117
+ event_culture_name: event_culture_name,
118
+ know_user_secret_key: know_user_secret_key,
119
+ queue_number_validity_in_minutes: queue_number_validity_in_minutes)
120
+
121
+ expect(stub).to have_been_requested
122
+ end
123
+
124
+ private
125
+
126
+ let(:valid_create_body) do
127
+ {
128
+ "DisplayName" => display_name,
129
+ "RedirectUrl" => redirect_url,
130
+ "Description" => description,
131
+ "TimeZone" => "UTC",
132
+ "PreQueueStartTime" => "2015-04-28T14:25:46.0000000Z",
133
+ "EventStartTime" => "2015-04-28T15:25:46.0000000Z",
134
+ "EventEndTime" => "2015-04-28T19:25:46.0000000Z",
135
+ "EventCulture" => event_culture_name,
136
+ "MaxNoOfRedirectsPrQueueId" => "1",
137
+ "QueueNumberValidityInMinutes" => "#{queue_number_validity_in_minutes}",
138
+ "AfterEventLogic" => "RedirectUsersToTargetPage",
139
+ "AfterEventRedirectPage" => "",
140
+ "UseSSL" => "Auto",
141
+ "JavaScriptSupportEnabled" => "False",
142
+ "TargetUrlSupportEnabled" => "False",
143
+ "SafetyNetMode" => "Disabled",
144
+ "KnowUserSecurity" => "MD5Hash",
145
+ "KnowUserSecretKey" => know_user_secret_key,
146
+ "CustomLayout" => "Default layout by Queue-it",
147
+ "XUsersInFrontOfYou" => nil,
148
+ "TargetUrlValidationRegex" => "",
149
+ "DomainAlias" => "",
150
+ "AllowedCustomLayouts" => [],
151
+ "BrowserCultureEnabled" => "True",
152
+ "IdleQueueLogic" => "UseBeforePage",
153
+ "IdleQueueRedirectPage" => ""
154
+ }
155
+ end
156
+ end
157
+
158
+ context "#set_speed" do
159
+ let(:client) { Client.new(api_key: "SECURE_KEY") }
160
+ let(:max_redirects_per_minute) { 15 }
161
+
162
+ specify "Proper speed value is set" do
163
+ body = { "MaxRedirectsPerMinute" => "15" }
164
+
165
+ stub = stub_request(:put, "https://api2.queue-it.net/2_0_beta/event/fancyevent/queue/speed")
166
+ .with(body: body, headers: headers)
167
+
168
+ event_adapter.set_speed(event_id: event_id, max_redirects_per_minute: max_redirects_per_minute)
169
+
170
+ expect(stub).to have_been_requested
171
+ end
172
+
173
+ specify "Speed must be greater than 5 so we send at least 5" do
174
+ expected_body = { "MaxRedirectsPerMinute" => "5" }
175
+
176
+ stub = stub_request(:put, "https://api2.queue-it.net/2_0_beta/event/fancyevent/queue/speed")
177
+ .with(body: expected_body, headers: headers)
178
+
179
+ event_adapter.set_speed(event_id: event_id, max_redirects_per_minute: 1)
180
+
181
+ expect(stub).to have_been_requested
182
+ end
183
+
184
+ specify "Event id must have proper format" do
185
+ invalid_event_id = "/fancyevent"
186
+
187
+ expect do
188
+ event_adapter.set_speed(event_id: invalid_event_id, max_redirects_per_minute: max_redirects_per_minute)
189
+ end.to raise_error(Event::InvalidEventIdFormat)
190
+ end
191
+ end
192
+
193
+ private
194
+
195
+ let(:headers) { {'Accept' =>'application/json', 'Content-Type' =>'application/json', 'Api-Key' =>'SECURE_KEY'} }
196
+ end
197
+ end
198
+ end
metadata CHANGED
@@ -1,78 +1,127 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: queue_it
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - Kasper Grubbe
7
+ - Billetto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-06 00:00:00.000000000 Z
11
+ date: 2015-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '2.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '2.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.9'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday_middleware
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: bundler
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
- - - ~>
59
+ - - "~>"
32
60
  - !ruby/object:Gem::Version
33
61
  version: '1.3'
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
- - - ~>
66
+ - - "~>"
39
67
  - !ruby/object:Gem::Version
40
68
  version: '1.3'
41
69
  - !ruby/object:Gem::Dependency
42
- name: rake
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
43
85
  requirement: !ruby/object:Gem::Requirement
44
86
  requirements:
45
- - - '>='
87
+ - - "~>"
46
88
  - !ruby/object:Gem::Version
47
- version: '0'
89
+ version: '1.21'
48
90
  type: :development
49
91
  prerelease: false
50
92
  version_requirements: !ruby/object:Gem::Requirement
51
93
  requirements:
52
- - - '>='
94
+ - - "~>"
53
95
  - !ruby/object:Gem::Version
54
- version: '0'
96
+ version: '1.21'
55
97
  description: Gem to handle the implementation of http://queue-it.net!
56
98
  email:
57
- - kawsper@gmail.com
99
+ - development@billetto.dk
58
100
  executables: []
59
101
  extensions: []
60
102
  extra_rdoc_files: []
61
103
  files:
62
- - .gitignore
104
+ - ".gitignore"
105
+ - CHANGELOG.md
63
106
  - Gemfile
64
107
  - LICENSE.txt
65
108
  - README.md
66
109
  - Rakefile
67
110
  - app/views/queue_it/cheating_queue.html.erb
68
111
  - app/views/queue_it/enter_queue.html.erb
112
+ - lib/faraday/raise_http_exception.rb
69
113
  - lib/queue_it.rb
114
+ - lib/queue_it/api/client.rb
115
+ - lib/queue_it/api/error.rb
116
+ - lib/queue_it/api/event.rb
70
117
  - lib/queue_it/known_user_checker.rb
71
118
  - lib/queue_it/queueable.rb
72
119
  - lib/queue_it/railtie.rb
73
120
  - lib/queue_it/url_builder.rb
74
121
  - lib/queue_it/version.rb
75
122
  - queue_it.gemspec
123
+ - spec/queue_it/api/client_spec.rb
124
+ - spec/queue_it/api/event_spec.rb
76
125
  homepage: https://github.com/gfish/queue_it
77
126
  licenses:
78
127
  - GNU/GPLv3
@@ -83,18 +132,20 @@ require_paths:
83
132
  - lib
84
133
  required_ruby_version: !ruby/object:Gem::Requirement
85
134
  requirements:
86
- - - '>='
135
+ - - ">="
87
136
  - !ruby/object:Gem::Version
88
137
  version: '0'
89
138
  required_rubygems_version: !ruby/object:Gem::Requirement
90
139
  requirements:
91
- - - '>='
140
+ - - ">="
92
141
  - !ruby/object:Gem::Version
93
142
  version: '0'
94
143
  requirements: []
95
144
  rubyforge_project:
96
- rubygems_version: 2.0.14
145
+ rubygems_version: 2.2.2
97
146
  signing_key:
98
147
  specification_version: 4
99
148
  summary: Gem to handle the implementation of http://queue-it.net
100
- test_files: []
149
+ test_files:
150
+ - spec/queue_it/api/client_spec.rb
151
+ - spec/queue_it/api/event_spec.rb