poptart 0.0.13 → 0.0.14

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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/lib/poptart.rb +1 -4
  4. data/lib/poptart/link.rb +9 -0
  5. data/lib/poptart/model.rb +13 -29
  6. data/lib/poptart/question.rb +21 -17
  7. data/lib/poptart/root.rb +10 -1
  8. data/lib/poptart/survey.rb +34 -7
  9. data/lib/poptart/survey_question.rb +32 -12
  10. data/lib/poptart/user.rb +4 -21
  11. data/lib/version.rb +1 -1
  12. data/poptart.gemspec +0 -4
  13. data/spec/lib/poptart/model_spec.rb +95 -0
  14. data/spec/lib/poptart/question_spec.rb +47 -0
  15. data/spec/lib/poptart/root_spec.rb +50 -0
  16. data/spec/lib/poptart/survey_question_spec.rb +166 -0
  17. data/spec/lib/poptart/survey_spec.rb +105 -0
  18. data/spec/lib/poptart/user_spec.rb +45 -0
  19. data/spec/requests/questions_spec.rb +31 -0
  20. data/spec/requests/survey_questions_spec.rb +150 -0
  21. data/spec/requests/surveys_spec.rb +34 -5
  22. data/spec/requests/{user_management_spec.rb → users_spec.rb} +5 -5
  23. data/spec/spec_helper.rb +1 -4
  24. data/spec/vcr/answering/survey_questions_answers_a_multiple_choice_question.yml +1527 -1596
  25. data/spec/vcr/answering/survey_questions_answers_a_survey_question.yml +2942 -2035
  26. data/spec/vcr/answering/survey_questions_creates_and_returns_a_random_question_survey.yml +254 -70
  27. data/spec/vcr/answering/survey_questions_creates_and_returns_an_empty_survey.yml +110 -48
  28. data/spec/vcr/answering/survey_questions_finds_survey_question_for_id.yml +1618 -286
  29. data/spec/vcr/poptart/survey/adds_a_question_to_a_survey.yml +1939 -0
  30. data/spec/vcr/poptart/survey/creates_a_random_survey.yml +318 -0
  31. data/spec/vcr/poptart/survey/creates_an_empty_survey.yml +702 -0
  32. data/spec/vcr/poptart/survey/returns_a_survey_by_id.yml +618 -0
  33. data/spec/vcr/poptart/user/creates_a_user.yml +179 -0
  34. data/spec/vcr/{user/management_creates_a_user.yml → poptart/user/returns_a_user.yml} +72 -69
  35. data/spec/vcr/questions/creates_a_question.yml +186 -0
  36. data/spec/vcr/questions/finds_a_question_by_id.yml +326 -0
  37. data/spec/vcr/questions/finds_a_question_by_key.yml +144 -0
  38. data/spec/vcr/questions/returns_all_answered_survey_questions_for_a_question.yml +1021 -0
  39. data/spec/vcr/retrieving/answers_returns_all_answered_survey_questions_for_a_question.yml +533 -479
  40. data/spec/vcr/survey/questions_answers_a_multiple_choice_question.yml +1454 -0
  41. data/spec/vcr/survey/questions_answers_a_survey_question.yml +1772 -0
  42. data/spec/vcr/survey/questions_creates_and_returns_an_empty_survey.yml +372 -0
  43. data/spec/vcr/survey/questions_finds_survey_question_for_id.yml +3083 -0
  44. data/spec/vcr/survey/questions_returns_all_answered_survey_questions_for_a_question.yml +5756 -0
  45. data/spec/vcr/survey/questions_returns_all_answered_survey_questions_for_a_question_by_key.yml +973 -0
  46. data/spec/vcr/survey/questions_returns_all_answered_survey_questions_for_a_survey.yml +620 -0
  47. metadata +55 -72
  48. data/lib/poptart/boolean_question.rb +0 -14
  49. data/lib/poptart/multiple_response_question.rb +0 -9
  50. data/lib/poptart/range_question.rb +0 -9
  51. data/lib/poptart/time_question.rb +0 -9
  52. data/spec/requests/answering_survey_questions_spec.rb +0 -79
  53. data/spec/requests/answers_spec.rb +0 -45
  54. data/spec/requests/creating_questions_spec.rb +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e454a49d246480fbceba4a7a07fbfbb43ecb6949
4
- data.tar.gz: 3688f52a375033dbc60a778f4cee1f9d7321bd57
3
+ metadata.gz: 805d1e873fdd7fe9a06cdbd4f8753cc6d8900ac0
4
+ data.tar.gz: 7a7d7ee6954629aea9ae683b5c91598fa524603b
5
5
  SHA512:
6
- metadata.gz: 9ec9f2b803bfd4ad5a28f0af65a3c5e7b2d5286bb2d938941c9dba4e43175f5643072c6e8a9e8f998a4663de2db5a2f2dc570e7529f1e708eaf1451f5120373b
7
- data.tar.gz: 0918d4b46bbc134b55d9e5660a022e28d27928070a12e14760a21a220a8317711905af2fe3a85965475463ecc035867fc2c8fa44eeabd0845f92b751b94ca4c6
6
+ metadata.gz: 84a0a219316b81765ee869926ca6230b60af2890cb4975e493d86116610b78b213800ab08a85990e2f8921ee4847aa1c4e61b8aa6601ead3492642e74275e819
7
+ data.tar.gz: 9c5b3e0cc0fd80ba004ddca6dcbf22e8a07e5eab53e2ac949103b38dff69a357364c27ac45c87a3edf44d09e0ef2f00ff501780fb213b708d8484aba9d2dc7ed
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.1.1
1
+ ruby-2.1.3
data/lib/poptart.rb CHANGED
@@ -41,13 +41,10 @@ require "addressable/template"
41
41
 
42
42
  require_relative 'version'
43
43
  require_relative 'poptart/request'
44
+ require_relative 'poptart/link'
44
45
  require_relative 'poptart/model'
45
46
  require_relative 'poptart/root'
46
47
  require_relative 'poptart/survey'
47
48
  require_relative 'poptart/survey_question'
48
49
  require_relative 'poptart/question'
49
- require_relative 'poptart/boolean_question'
50
- require_relative 'poptart/multiple_response_question'
51
- require_relative 'poptart/range_question'
52
- require_relative 'poptart/time_question'
53
50
  require_relative 'poptart/user'
@@ -0,0 +1,9 @@
1
+ class Link
2
+ attr_reader :rel, :href, :method
3
+
4
+ def initialize(href:, rel:, method:)
5
+ @rel = rel
6
+ @href = href
7
+ @method = method
8
+ end
9
+ end
data/lib/poptart/model.rb CHANGED
@@ -13,7 +13,13 @@ module Poptart
13
13
  end
14
14
 
15
15
  @id = @params['id']
16
- @links = Hashie::Mash.new(@params['_links'])
16
+
17
+ @links = []
18
+ if @params['_links']
19
+ @params['_links'].each do |link|
20
+ @links << Link.new(href: link['href'], rel: link['rel'], method: link['method'])
21
+ end
22
+ end
17
23
  end
18
24
 
19
25
  def self.root
@@ -26,38 +32,16 @@ module Poptart
26
32
  Poptart::Model.root
27
33
  end
28
34
 
29
- def users_url(id: nil, query: nil)
30
- template = Addressable::Template.new(links.users.href)
31
- template.expand(id: id, query: query).to_s
32
- end
33
-
34
- def surveys_url(id: nil, query: nil)
35
- template = Addressable::Template.new(links.surveys.href)
36
- template.expand(id: id, query: query).to_s
37
- end
38
-
39
- def questions_url(id: nil, query: nil)
40
- template = Addressable::Template.new(links.questions.href)
41
- template.expand(id: id, query: query).to_s
42
- end
43
-
44
- def survey_questions_url(question_id: nil, query: nil)
45
- template = Addressable::Template.new(links.survey_questions.href)
46
- template.expand(question_id: question_id, query: query).to_s
35
+ def url(relation: , method: 'GET', query: nil, survey_id: nil, id: nil)
36
+ link = find_link(relation, method)
37
+ template = Addressable::Template.new(link.href)
38
+ template.expand(survey_id: survey_id, id: id, query: query).to_s
47
39
  end
48
40
 
49
41
  private
50
42
 
51
- def root_uri
52
- @root_uri = URI.parse(root.links.self.href)
53
- end
54
-
55
- def scheme
56
- root_uri.scheme
57
- end
58
-
59
- def host
60
- root_uri.port ? "#{root_uri.host}:#{root_uri.port}" : root_uri.host
43
+ def find_link(relation, method)
44
+ links.find { |link| link.rel == relation && link.method == method }
61
45
  end
62
46
  end
63
47
  end
@@ -2,31 +2,39 @@ module Poptart
2
2
  class Question < Model
3
3
  extend Poptart::Request
4
4
 
5
- attr_accessor :responses, :freeform, :question_type, :absolute_index, :parent_question_id, :key
5
+ attr_accessor :responses, :question_type, :key, :text
6
6
 
7
7
  def initialize(response)
8
8
  super
9
9
  @responses = params['responses']
10
- @freeform = params['freeform']
11
10
  @question_type = params['question_type']
12
- @absolute_index = params['absolute_index']
13
- @parent_question_id = params['parent_question_id']
11
+ @text = params['text']
14
12
  @key = params['key']
15
13
  end
16
14
 
17
- def self.create(text, responses: [], freeform: false, absolute_index: nil, parent_question_id: nil, key: nil)
18
- response = post(root.questions_url, question: { question_type: question_type,
19
- responses: responses,
20
- text: text,
21
- freeform: freeform,
22
- absolute_index: absolute_index,
23
- parent_question_id: parent_question_id,
24
- key: key})
15
+ def self.create(text,
16
+ responses: [],
17
+ question_type: nil,
18
+ key: nil)
19
+
20
+ question_data = {
21
+ 'question_type' => question_type,
22
+ 'responses' => responses,
23
+ 'text' => text,
24
+ 'key' => key
25
+ }
26
+ url = root.url(relation: 'questions', method: 'POST')
27
+ response = post(url, 'question' => question_data)
28
+ new(response)
29
+ end
30
+
31
+ def self.find(id_or_key)
32
+ response = get(root.url(relation: 'questions', id: id_or_key))
25
33
  new(response)
26
34
  end
27
35
 
28
36
  def self.all(params = {})
29
- response = get(root.questions_url)
37
+ response = get(root.url(relation: 'questions'))
30
38
  JSON.parse(response.body).map do |question|
31
39
  if params[:type]
32
40
  if question['question_type'] == params[:type]
@@ -37,9 +45,5 @@ module Poptart
37
45
  end
38
46
  end.compact
39
47
  end
40
-
41
- def freeform?
42
- @freeform
43
- end
44
48
  end
45
49
  end
data/lib/poptart/root.rb CHANGED
@@ -1,6 +1,15 @@
1
1
  module Poptart
2
2
  class Root < Model
3
- attr_accessor :links
3
+ def root_uri
4
+ @root_uri = URI.parse(root.links.self.href)
5
+ end
4
6
 
7
+ def scheme
8
+ root_uri.scheme
9
+ end
10
+
11
+ def host
12
+ root_uri.port ? "#{root_uri.host}:#{root_uri.port}" : root_uri.host
13
+ end
5
14
  end
6
15
  end
@@ -8,19 +8,27 @@ module Poptart
8
8
  @service_user_id = params['service_user_id']
9
9
  @completed = params['completed']
10
10
 
11
- @survey_questions = params['survey_questions'].map do |survey_question|
12
- if survey_question['type'] == 'BooleanQuestion'
13
- BooleanQuestion.new(survey_question)
14
- else
11
+ if params['survey_questions']
12
+ @survey_questions = params['survey_questions'].map do |survey_question|
15
13
  SurveyQuestion.new(survey_question)
16
14
  end
15
+ else
16
+ @survey_questions = []
17
17
  end
18
18
  end
19
19
 
20
- def add_question(question)
21
- response = post(links.survey_questions.post.href, { survey_question: { question_id: question.id } } )
20
+ def add_survey_question(survey_question)
21
+ url = url(relation: 'survey-questions', method: 'POST')
22
+ response = post(url, {
23
+ 'survey_question' => {
24
+ 'question_id' => survey_question.question_id,
25
+ 'responses' => survey_question.responses
26
+ }
27
+ })
22
28
  if response.status == 201
23
- Poptart::SurveyQuestion.new(response).tap { |survey_question| survey_questions << survey_question }
29
+ survey_question = Poptart::SurveyQuestion.new(response)
30
+ survey_questions << survey_question
31
+ survey_question
24
32
  end
25
33
  end
26
34
 
@@ -33,5 +41,24 @@ module Poptart
33
41
  def completed?
34
42
  @completed
35
43
  end
44
+
45
+ def self.create
46
+ url = root.url(relation: 'surveys', method: 'POST')
47
+ response = post(url)
48
+ Poptart::Survey.new(response)
49
+ end
50
+
51
+ def self.all
52
+ response = get(root.url(relation: 'surveys'))
53
+ JSON.parse(response.body)['surveys'].map do |survey|
54
+ Poptart::Survey.new(survey)
55
+ end
56
+ end
57
+
58
+ def self.find(id)
59
+ url = root.url(relation: 'surveys', id: id)
60
+ response = get(url)
61
+ Poptart::Survey.new(response)
62
+ end
36
63
  end
37
64
  end
@@ -3,17 +3,17 @@ module Poptart
3
3
  extend Poptart::Request
4
4
  include Poptart::Request
5
5
 
6
- attr_accessor :text, :answer, :type, :responses, :key
6
+ attr_accessor :text, :answer, :question_type, :responses, :key, :question_id
7
7
 
8
8
  def initialize(response)
9
9
  super
10
10
  @text = params['text']
11
- @type = params['type']
12
- @freeform = params['freeform']
11
+ @question_type = params['question_type']
13
12
  @responses = params['responses']
14
13
  @answer = params['answer']
15
14
  @created_at = params['created_at']
16
15
  @key = params['key']
16
+ @question_id = params['question_id']
17
17
 
18
18
  if @answer == 't'
19
19
  @answer = true
@@ -23,31 +23,51 @@ module Poptart
23
23
  end
24
24
 
25
25
  def boolean?
26
- type == "boolean"
26
+ question_type == "boolean"
27
27
  end
28
28
 
29
29
  def multiple?
30
- type == "multiple"
30
+ question_type == "multiple"
31
31
  end
32
32
 
33
33
  def range?
34
- type == "range"
34
+ question_type == "range"
35
35
  end
36
36
 
37
37
  def time?
38
- type == "time"
39
- end
40
-
41
- def freeform?
42
- @freeform == true
38
+ question_type == "time"
43
39
  end
44
40
 
45
41
  def created_at
46
42
  DateTime.parse(@created_at)
47
43
  end
48
44
 
45
+ def self.find_all(question_id: nil, key: nil, survey_id: nil)
46
+ if question_id
47
+ query = { question_id: question_id }
48
+ elsif key
49
+ query = { key: key }
50
+ elsif survey_id
51
+ query = { survey_id: survey_id }
52
+ end
53
+
54
+ url = root.url(relation: 'survey-questions-by-query', query: query)
55
+ response = get(url)
56
+ JSON.parse(response.body)["survey_questions"].map do |response_body|
57
+ Poptart::SurveyQuestion.new(response_body)
58
+ end
59
+ end
60
+
49
61
  def submit
50
- response = put(links.put.href, { id: id, survey_question: { answer: answer} })
62
+ url = url(method: 'PUT', relation: 'self')
63
+ response = put(url,
64
+ {
65
+ 'id' => id,
66
+ 'survey_question' => {
67
+ 'answer' => answer
68
+ }
69
+ }
70
+ )
51
71
  response.status == 204
52
72
  end
53
73
  end
data/lib/poptart/user.rb CHANGED
@@ -11,33 +11,16 @@ module Poptart
11
11
  end
12
12
 
13
13
  def self.create
14
- response = post(root.users_url)
14
+ url = root.url(relation: 'users', method: 'POST')
15
+ response = post(url)
15
16
  Poptart::User.new(response)
16
17
  end
17
18
 
18
- def self.for_id(service_user_id)
19
- url = root.users_url(id: service_user_id)
20
- response = get(url)
19
+ def self.get_user
20
+ response = get(root.url(relation: 'users'))
21
21
  Poptart::User.new(response)
22
22
  end
23
23
 
24
- def create_survey
25
- response = post(root.surveys_url, { survey: { service_user_id: service_user_id } })
26
- Poptart::Survey.new(response)
27
- end
28
-
29
- def create_random_survey
30
- url = root.surveys_url(query: {random: true})
31
- response = post(url, { survey: { service_user_id: service_user_id } })
32
- Poptart::Survey.new(response)
33
- end
34
-
35
- def survey_for_id(id)
36
- url = root.surveys_url(id: id)
37
- response = get(url)
38
- Poptart::Survey.new(response)
39
- end
40
-
41
24
  def survey_questions_for_question_id(question_id)
42
25
  url = root.survey_questions_url(question_id: question_id)
43
26
  response = get(url)
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Poptart
2
- VERSION = "0.0.13"
2
+ VERSION = "0.0.14"
3
3
  end
data/poptart.gemspec CHANGED
@@ -20,10 +20,6 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency 'faraday'
21
21
  gem.add_dependency 'addressable'
22
22
 
23
- gem.add_development_dependency 'bourne', "1.5.0"
24
- gem.add_development_dependency 'guard'
25
- gem.add_development_dependency 'guard-rspec'
26
- gem.add_development_dependency 'mocha', "~> 0.14.0"
27
23
  gem.add_development_dependency 'pry'
28
24
  gem.add_development_dependency 'rspec'
29
25
  gem.add_development_dependency 'rake'
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Poptart::Model do
4
+ class Poptart::TestModel < Poptart::Model; end
5
+
6
+ context '.new' do
7
+ context 'response is a hash' do
8
+ it 'sets id' do
9
+ response = { 'id' => 1 }
10
+ model = Poptart::TestModel.new(response)
11
+ expect(model.id).to eq(1)
12
+ end
13
+
14
+ it 'sets links' do
15
+ response = {
16
+ '_links' => [
17
+ { 'rel' => 'self',
18
+ 'href' => 'http://example.com'
19
+ }
20
+ ]
21
+ }
22
+ model = Poptart::TestModel.new(response)
23
+ expect(model.links.count).to eq(1)
24
+ link = model.links.first
25
+ expect(link.rel).to eq('self')
26
+ expect(link.href).to eq('http://example.com')
27
+ end
28
+ end
29
+
30
+ context 'response is http response object' do
31
+ it 'sets id' do
32
+ response = double(:response, status: 200, body: { 'id' => 1, status: 200 }.to_json)
33
+ model = Poptart::TestModel.new(response)
34
+ expect(model.id).to eq(1)
35
+ end
36
+
37
+ it 'sets links' do
38
+ response = double(:response, status: 200, body: {
39
+ '_links' => [
40
+ { 'rel' => 'self',
41
+ 'href' => 'http://example.com'
42
+ }
43
+ ]
44
+ }.to_json)
45
+
46
+ model = Poptart::TestModel.new(response)
47
+ expect(model.links.count).to eq(1)
48
+ link = model.links.first
49
+ expect(link.rel).to eq('self')
50
+ expect(link.href).to eq('http://example.com')
51
+ end
52
+ end
53
+
54
+ context 'invalid response' do
55
+ it 'raises unauthorized exception' do
56
+ response = double(:response, status: 401)
57
+ expect{
58
+ Poptart::TestModel.new(response)
59
+ }.to raise_exception('Unauthorized')
60
+ end
61
+ end
62
+ end
63
+
64
+ context '.root' do
65
+ it 'returns Root' do
66
+ root_response = double(:response)
67
+ root = double(:root)
68
+ allow(Poptart::Model).to receive(:get).with('/').and_return(root_response)
69
+ allow(Poptart::Root).to receive(:new).with(root_response).and_return(root)
70
+
71
+ returned_root = Poptart::TestModel.root
72
+
73
+ expect(Poptart::Model).to have_received(:get).with('/')
74
+ expect(Poptart::Root).to have_received(:new).with(root_response)
75
+ expect(returned_root).to eq(root)
76
+ end
77
+ end
78
+
79
+ context '#root' do
80
+ it 'returns root' do
81
+ root_response = double(:response)
82
+ root = double(:root)
83
+ allow(Poptart::Model).to receive(:get).with('/').and_return(root_response)
84
+ allow(Poptart::Root).to receive(:new).with(root_response).and_return(root)
85
+
86
+ model = Poptart::TestModel.new({})
87
+ returned_root = model.root
88
+
89
+ expect(Poptart::Model).to have_received(:get).with('/')
90
+ expect(Poptart::Root).to have_received(:new).with(root_response)
91
+ expect(returned_root).to eq(root)
92
+ end
93
+ end
94
+ end
95
+