qualtrics 0.5.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.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +3 -0
  3. data/.gitignore +23 -0
  4. data/.rspec +1 -0
  5. data/Gemfile +7 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +29 -0
  8. data/Rakefile +7 -0
  9. data/lib/qualtrics.rb +52 -0
  10. data/lib/qualtrics/configuration.rb +17 -0
  11. data/lib/qualtrics/distribution.rb +90 -0
  12. data/lib/qualtrics/entity.rb +55 -0
  13. data/lib/qualtrics/mailer.rb +111 -0
  14. data/lib/qualtrics/message.rb +75 -0
  15. data/lib/qualtrics/operation.rb +77 -0
  16. data/lib/qualtrics/panel.rb +69 -0
  17. data/lib/qualtrics/panel_import.rb +41 -0
  18. data/lib/qualtrics/panel_import_file.rb +28 -0
  19. data/lib/qualtrics/recipient.rb +109 -0
  20. data/lib/qualtrics/recipient_import_row.rb +40 -0
  21. data/lib/qualtrics/response.rb +35 -0
  22. data/lib/qualtrics/survey.rb +80 -0
  23. data/lib/qualtrics/survey_import.rb +26 -0
  24. data/lib/qualtrics/transaction.rb +70 -0
  25. data/lib/qualtrics/version.rb +3 -0
  26. data/qualtrics.gemspec +34 -0
  27. data/spec/fixtures/sample_survey.xml +2 -0
  28. data/spec/fixtures/vcr_cassettes/Qualtrics_Distribution/creating_to_qualtrics/can_retrieve_a_panel_of_distributions_in_qualtrics.yml +655 -0
  29. data/spec/fixtures/vcr_cassettes/Qualtrics_Distribution/creating_to_qualtrics/can_update_itself.yml +599 -0
  30. data/spec/fixtures/vcr_cassettes/Qualtrics_Mailer/creating_to_qualtrics/sends_a_reminder_to_a_distribution.yml +493 -0
  31. data/spec/fixtures/vcr_cassettes/Qualtrics_Mailer/creating_to_qualtrics/sends_a_survey_to_a_panel_and_creates_a_distribution.yml +441 -0
  32. data/spec/fixtures/vcr_cassettes/Qualtrics_Mailer/creating_to_qualtrics/sends_a_survey_to_an_individual_and_creates_a_distribution.yml +441 -0
  33. data/spec/fixtures/vcr_cassettes/Qualtrics_Message/creating_to_qualtrics/persists_to_qualtrics.yml +56 -0
  34. data/spec/fixtures/vcr_cassettes/Qualtrics_Message/creating_to_qualtrics/populates_the_message_id_when_successful.yml +56 -0
  35. data/spec/fixtures/vcr_cassettes/Qualtrics_Message/creating_to_qualtrics/populates_the_success_attribute.yml +56 -0
  36. data/spec/fixtures/vcr_cassettes/Qualtrics_Message/retrieves_an_array_of_all_panels_in_a_library.yml +115 -0
  37. data/spec/fixtures/vcr_cassettes/Qualtrics_Panel/creating_to_qualtrics/persists_to_qualtrics.yml +107 -0
  38. data/spec/fixtures/vcr_cassettes/Qualtrics_Panel/creating_to_qualtrics/populates_the_panel_id_when_successful.yml +107 -0
  39. data/spec/fixtures/vcr_cassettes/Qualtrics_Panel/creating_to_qualtrics/populates_the_success_attribute.yml +107 -0
  40. data/spec/fixtures/vcr_cassettes/Qualtrics_Panel/destroys_a_panel_that_returns_true_when_successful.yml +107 -0
  41. data/spec/fixtures/vcr_cassettes/Qualtrics_Panel/raises_an_error_when_you_attempt_to_save_an_already_presisted_panel.yml +55 -0
  42. data/spec/fixtures/vcr_cassettes/Qualtrics_Panel/retrieves_an_array_of_all_panels_in_a_library.yml +704 -0
  43. data/spec/fixtures/vcr_cassettes/Qualtrics_PanelImport/transmits_to_qualtrics.yml +72 -0
  44. data/spec/fixtures/vcr_cassettes/Qualtrics_Recipient/creating_to_qualtrics/persists_to_qualtrics.yml +159 -0
  45. data/spec/fixtures/vcr_cassettes/Qualtrics_Recipient/creating_to_qualtrics/populates_the_recipient_id_when_successful.yml +159 -0
  46. data/spec/fixtures/vcr_cassettes/Qualtrics_Recipient/creating_to_qualtrics/populates_the_success_attribute.yml +159 -0
  47. data/spec/fixtures/vcr_cassettes/Qualtrics_Recipient/creating_to_qualtrics/raises_an_error_when_a_recipient_is_created_without_specifying_a_panel_id.yml +107 -0
  48. data/spec/fixtures/vcr_cassettes/Qualtrics_Recipient/recipient_made_in_qualtrics/can_delete_itself_in_qualtrics.yml +311 -0
  49. data/spec/fixtures/vcr_cassettes/Qualtrics_Recipient/recipient_made_in_qualtrics/can_update_itself_in_qualtrics.yml +313 -0
  50. data/spec/fixtures/vcr_cassettes/Qualtrics_Recipient/recipient_made_in_qualtrics/gets_its_information_in_qualtrics.yml +209 -0
  51. data/spec/fixtures/vcr_cassettes/Qualtrics_Survey/creating_to_qualtrics/can_be_activated_or_deactivated.yml +232 -0
  52. data/spec/fixtures/vcr_cassettes/Qualtrics_Survey/creating_to_qualtrics/destroys_a_survey_that_returns_true_when_successful.yml +128 -0
  53. data/spec/fixtures/vcr_cassettes/Qualtrics_Survey/creating_to_qualtrics/populates_the_survey_id_when_successful.yml +128 -0
  54. data/spec/fixtures/vcr_cassettes/Qualtrics_Survey/creating_to_qualtrics/retrieves_an_array_of_all_surveys.yml +203 -0
  55. data/spec/fixtures/vcr_cassettes/Qualtrics_SurveyImport/transmits_to_qualtrics.yml +128 -0
  56. data/spec/qualtrics/configuration_spec.rb +53 -0
  57. data/spec/qualtrics/distribution_spec.rb +144 -0
  58. data/spec/qualtrics/mailer_spec.rb +127 -0
  59. data/spec/qualtrics/message_spec.rb +105 -0
  60. data/spec/qualtrics/panel_import_file_spec.rb +26 -0
  61. data/spec/qualtrics/panel_import_spec.rb +43 -0
  62. data/spec/qualtrics/panel_spec.rb +80 -0
  63. data/spec/qualtrics/recipient_import_row_spec.rb +62 -0
  64. data/spec/qualtrics/recipient_spec.rb +185 -0
  65. data/spec/qualtrics/response_spec.rb +41 -0
  66. data/spec/qualtrics/survey_import_spec.rb +44 -0
  67. data/spec/qualtrics/survey_spec.rb +125 -0
  68. data/spec/spec_helper.rb +11 -0
  69. data/spec/support/_dotenv.rb +2 -0
  70. data/spec/support/qualtrics.rb +5 -0
  71. data/spec/support/vcr.rb +11 -0
  72. metadata +330 -0
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qualtrics::Configuration do
4
+ it 'has a version' do
5
+ version = '2.3'
6
+ configuration = Qualtrics::Configuration.new do |config|
7
+ config.version = version
8
+ end
9
+ expect(configuration.version).to eq(version)
10
+ end
11
+
12
+ it 'defaults to latest version' do
13
+ configuration = Qualtrics::Configuration.new
14
+ expect(configuration.version).to eq(Qualtrics::Configuration::DEFAULT_VERSION)
15
+ end
16
+
17
+ it 'has a user' do
18
+ user = 'fake@example.com'
19
+ configuration = Qualtrics::Configuration.new do |config|
20
+ config.user = user
21
+ end
22
+ expect(configuration.user).to eq(user)
23
+ end
24
+
25
+ it 'has a token' do
26
+ token = '12341234'
27
+ configuration = Qualtrics::Configuration.new do |config|
28
+ config.token = token
29
+ end
30
+ expect(configuration.token).to eq(token)
31
+ end
32
+
33
+ it 'has an endpoint' do
34
+ endpoint = 'https://co1.qualtrics.com/WRAPI/ControlPanel/api.php'
35
+ configuration = Qualtrics::Configuration.new do |config|
36
+ config.endpoint = endpoint
37
+ end
38
+ expect(configuration.endpoint).to eq(endpoint)
39
+ end
40
+
41
+ it 'has a default endpoint' do
42
+ configuration = Qualtrics::Configuration.new
43
+ expect(configuration.endpoint).to eq(Qualtrics::Configuration::DEFAULT_ENDPOINT)
44
+ end
45
+
46
+ it 'has a default library id' do
47
+ library_id = 1
48
+ configuration = Qualtrics::Configuration.new do |config|
49
+ config.default_library_id = library_id
50
+ end
51
+ expect(configuration.default_library_id).to eql(library_id)
52
+ end
53
+ end
@@ -0,0 +1,144 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qualtrics::Distribution, vcr: true do
4
+ it 'has a id' do
5
+ id = 'JOASNDOANSd'
6
+ distribution = Qualtrics::Distribution.new({
7
+ id: id
8
+ })
9
+ expect(distribution.id).to eq(id)
10
+ end
11
+
12
+ it 'has a survey id' do
13
+ survey_id = 'survey123'
14
+ distribution = Qualtrics::Distribution.new({
15
+ survey_id: survey_id
16
+ })
17
+ expect(distribution.survey_id).to eq(survey_id)
18
+ end
19
+
20
+ it 'has a message id' do
21
+ message_id = 'message123'
22
+ distribution = Qualtrics::Distribution.new({
23
+ message_id: message_id
24
+ })
25
+ expect(distribution.message_id).to eq(message_id)
26
+ end
27
+
28
+ it 'has response data' do
29
+ emails_sent = '1'
30
+ emails_failed = '2'
31
+ emails_responded = '3'
32
+ emails_bounced = '4'
33
+ emails_opened = '5'
34
+ emails_skipped = '6'
35
+
36
+ distribution = Qualtrics::Distribution.new({
37
+ emails_sent: emails_sent,
38
+ emails_failed: emails_failed,
39
+ emails_responded: emails_responded,
40
+ emails_bounced: emails_bounced,
41
+ emails_opened: emails_opened,
42
+ emails_skipped: emails_skipped
43
+ })
44
+
45
+ expect(distribution.emails_sent).to eq(emails_sent)
46
+ expect(distribution.emails_failed).to eq(emails_failed)
47
+ expect(distribution.emails_responded).to eq(emails_responded)
48
+ expect(distribution.emails_bounced).to eq(emails_bounced)
49
+ expect(distribution.emails_opened).to eq(emails_opened)
50
+ expect(distribution.emails_skipped).to eq(emails_skipped)
51
+ end
52
+
53
+ context 'creating to qualtrics' do
54
+ let(:panel) do
55
+ Qualtrics::Panel.new({
56
+ name: 'Newest Panel',
57
+ category: 'Great Category'
58
+ })
59
+ end
60
+
61
+ let(:survey_import) do
62
+ survey_import = Qualtrics::SurveyImport.new({
63
+ survey_name: 'Complex survey',
64
+ survey_data_location: 'spec/fixtures/sample_survey.xml'
65
+ })
66
+ end
67
+
68
+ let(:survey) { survey_import.survey }
69
+
70
+
71
+ let(:recipient) do
72
+ Qualtrics::Recipient.new({
73
+ panel_id: panel.id,
74
+ email: 'working@hard.com'
75
+ })
76
+ end
77
+
78
+ let(:recipient2) do
79
+ Qualtrics::Recipient.new({
80
+ panel_id: panel.id,
81
+ email: 'notworking@hard.com'
82
+ })
83
+ end
84
+
85
+ let(:message) do
86
+ Qualtrics::Message.new({
87
+ name: 'Newest Message',
88
+ category: 'InviteEmails',
89
+ body: 'Welcome'
90
+ })
91
+ end
92
+
93
+ let(:mailer) do
94
+ mailer = Qualtrics::Mailer.new({
95
+ from_email: 'example@example.com',
96
+ from_name: 'yes_qualtrics',
97
+ subject: 'game convention'
98
+ })
99
+ end
100
+
101
+ before(:each) do
102
+ panel.save
103
+ recipient.save
104
+ recipient2.save
105
+ survey_import.save
106
+ message.save
107
+ end
108
+
109
+ after(:each) do
110
+ recipient.delete
111
+ recipient2.delete
112
+ panel.destroy
113
+ survey.destroy
114
+ end
115
+
116
+ it 'can retrieve a panel of distributions in qualtrics' do
117
+ mailer.send_survey_to_individual(recipient, message, survey)
118
+ mailer.send_survey_to_individual(recipient2, message, survey)
119
+
120
+ distributions = Qualtrics::Distribution.get_distribution_with_panel(panel, survey)
121
+ expect(distributions.length).to eql (2)
122
+
123
+ first_distribution = distributions[0]
124
+ expect(first_distribution.survey_id).to eql (survey.id)
125
+
126
+ expect(first_distribution.valid?).to be true
127
+ expect(first_distribution.emails_responded).to_not be_nil
128
+ expect(first_distribution.emails_sent ).to_not be_nil
129
+ expect(first_distribution.emails_failed ).to_not be_nil
130
+ expect(first_distribution.emails_responded).to_not be_nil
131
+ expect(first_distribution.emails_bounced ).to_not be_nil
132
+ expect(first_distribution.emails_opened ).to_not be_nil
133
+ expect(first_distribution.emails_skipped ).to_not be_nil
134
+ end
135
+
136
+ it 'can update itself' do
137
+ distribution = mailer.send_survey_to_individual(recipient, message, survey)
138
+ expect(distribution.emails_responded).to be_nil
139
+
140
+ expect(distribution.refresh).to be true
141
+ expect(distribution.emails_responded).to_not be_nil
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,127 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qualtrics::Mailer, :vcr do
4
+
5
+ it 'has a send date' do
6
+ send_date = Time.now.strftime('%Y-%m-%d %H:%M:%S')
7
+ mailer = Qualtrics::Mailer.new({
8
+ send_date: send_date
9
+ })
10
+ expect(mailer.send_date).to eq(send_date)
11
+ end
12
+
13
+ it 'has a default send date' do
14
+ send_date = Time.now.utc.in_time_zone(Qualtrics::Mailer::QUALTRICS_POST_TIMEZONE).strftime("%Y-%m-%d %H:%M:%S")
15
+ mailer = Qualtrics::Mailer.new({})
16
+ expect(mailer.send_date).to eq(send_date)
17
+ end
18
+
19
+ it 'has a from email' do
20
+ from_email = 'having_fun@isnthard.com'
21
+ mailer = Qualtrics::Mailer.new({
22
+ from_email: from_email
23
+ })
24
+ expect(mailer.from_email).to eq(from_email)
25
+ end
26
+
27
+ it 'has a from name' do
28
+ from_name = 'Pinkberry'
29
+ mailer = Qualtrics::Mailer.new({
30
+ from_name: from_name
31
+ })
32
+ expect(mailer.from_name).to eq(from_name)
33
+ end
34
+
35
+ it 'has a subject' do
36
+ subject = 'party invitation'
37
+ mailer = Qualtrics::Mailer.new({
38
+ subject: subject
39
+ })
40
+ expect(mailer.subject).to eq(subject)
41
+ end
42
+
43
+ it 'has a sent from email' do
44
+ sent_from_address = 'sent_here@gmail.com'
45
+ mailer = Qualtrics::Mailer.new({
46
+ sent_from_address: sent_from_address
47
+ })
48
+ expect(mailer.sent_from_address).to eq(sent_from_address)
49
+ end
50
+
51
+ let(:panel) do
52
+ Qualtrics::Panel.new({
53
+ name: 'Newest Panel',
54
+ category: 'Great Category'
55
+ })
56
+ end
57
+
58
+ let(:recipient) do
59
+ Qualtrics::Recipient.new({
60
+ panel_id: panel.id,
61
+ email: 'working@hard.com'
62
+ })
63
+ end
64
+
65
+ let(:message) do
66
+ Qualtrics::Message.new({
67
+ name: 'Newest Message',
68
+ category: 'InviteEmails',
69
+ body: 'Welcome'
70
+ })
71
+ end
72
+
73
+ let(:survey_import) do
74
+ survey_import = Qualtrics::SurveyImport.new({
75
+ survey_name: 'Complex survey',
76
+ survey_data_location: 'spec/fixtures/sample_survey.xml'
77
+ })
78
+ end
79
+
80
+ let(:survey) { survey_import.survey }
81
+
82
+ context 'creating to qualtrics' do
83
+ let(:from_name) { 'yes_qualtrics' }
84
+ let(:from_email) { 'example@example.com' }
85
+ let(:subject) { 'game convention' }
86
+ let(:mailer) do
87
+ mailer = Qualtrics::Mailer.new({
88
+ from_email: from_email,
89
+ from_name: from_name,
90
+ subject: subject
91
+ })
92
+ end
93
+
94
+ before(:each) do
95
+
96
+ panel.save
97
+ recipient.save
98
+ survey_import.save
99
+ message.save
100
+ end
101
+
102
+ after(:each) do
103
+ recipient.delete
104
+ panel.destroy
105
+ survey.destroy
106
+ end
107
+
108
+ it 'sends a survey to an individual and creates a distribution' do
109
+ qualtrics_distribution = mailer.send_survey_to_individual(recipient, message, survey)
110
+ expect(qualtrics_distribution.survey_id).to equal(survey.id)
111
+ expect(qualtrics_distribution.id).to_not be_nil
112
+ end
113
+
114
+ it 'sends a reminder to a distribution' do
115
+ qualtrics_distribution = mailer.send_survey_to_individual(recipient, message, survey)
116
+ reminder_distribution = mailer.send_reminder(qualtrics_distribution, message)
117
+ expect(reminder_distribution.survey_id).to equal(survey.id)
118
+ expect(reminder_distribution.id).to_not be_nil
119
+ end
120
+
121
+ it 'sends a survey to a panel and creates a distribution' do
122
+ qualtrics_distribution = mailer.send_survey_to_panel(panel, message, survey)
123
+ expect(qualtrics_distribution.survey_id).to equal(survey.id)
124
+ expect(qualtrics_distribution.id).to_not be_nil
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,105 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qualtrics::Message, vcr: true do
4
+ it 'has a name' do
5
+ name = 'New message'
6
+ message = Qualtrics::Message.new({
7
+ name: name
8
+ })
9
+ expect(message.name).to eq(name)
10
+ end
11
+
12
+ it 'has a category' do
13
+ category = 'InviteEmails'
14
+ message = Qualtrics::Message.new({
15
+ category: category
16
+ })
17
+ expect(message.category).to eq(category)
18
+ end
19
+
20
+ it 'only accepts valid categories' do
21
+ category = 'Not real category'
22
+ message = Qualtrics::Message.new({
23
+ category: category
24
+ })
25
+
26
+ expect(message.save).to be false
27
+ expect(message.errors[:category]).to_not be_blank
28
+ end
29
+
30
+ it 'has a body' do
31
+ body = 'Hi take my survey'
32
+ message = Qualtrics::Message.new({
33
+ body: body
34
+ })
35
+ expect(message.body).to eq(body)
36
+ end
37
+
38
+ it 'has a language' do
39
+ language = 'FR'
40
+ message = Qualtrics::Message.new({
41
+ language: language
42
+ })
43
+ expect(message.language).to eq(language)
44
+ end
45
+
46
+ it 'defaults to the configured language when none is specified' do
47
+ message = Qualtrics::Message.new
48
+ expect(message.language).to eq('EN')
49
+ end
50
+
51
+ it 'has a library id' do
52
+ library_id = '1'
53
+ message = Qualtrics::Message.new({
54
+ library_id: library_id
55
+ })
56
+ expect(message.library_id).to eq(library_id)
57
+ end
58
+
59
+ it 'defaults to the configured library id when none is specified' do
60
+ message = Qualtrics::Message.new
61
+ expect(message.library_id).to eq(Qualtrics.configuration.default_library_id)
62
+ end
63
+
64
+ let(:message) do
65
+ Qualtrics::Message.new({
66
+ name: 'Newest Message',
67
+ category: 'InviteEmails',
68
+ body: 'Welcome'
69
+ })
70
+ end
71
+
72
+ context 'creating to qualtrics' do
73
+ # before(:each) do
74
+ # Qualtrics.begin_transaction!
75
+ # end
76
+ #
77
+ # after(:each) do
78
+ # Qualtrics.rollback_transaction!
79
+ # end
80
+
81
+ it 'persists to qualtrics' do
82
+ expect(message.save).to be true
83
+ end
84
+
85
+ it 'populates the message_id when successful' do
86
+ message.save
87
+ expect(message.id).to_not be_nil
88
+ end
89
+
90
+ it 'populates the success attribute' do
91
+ message.save
92
+ expect(message).to be_success
93
+ end
94
+ end
95
+
96
+ # it 'destroys a message that returns true when successful' do
97
+ # message.save
98
+ # expect(message.destroy).to be true
99
+ # end
100
+
101
+ it 'retrieves an array of all panels in a library' do
102
+ message.save
103
+ expect(Qualtrics::Message.all.map{|m| m.id}).to include(message.id)
104
+ end
105
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qualtrics::PanelImportFile do
4
+ let(:email) { 'user@example.com' }
5
+ let(:recipients) {[Qualtrics::Recipient.new(email: email), Qualtrics::Recipient.new] }
6
+ let(:panel_import_file) do
7
+ Qualtrics::PanelImportFile.new(recipients)
8
+ end
9
+
10
+ it 'has a list of recipients' do
11
+ expect(panel_import_file.recipients).to eql(recipients)
12
+ end
13
+
14
+ it 'writes a temp file' do
15
+ expect(panel_import_file.temp_file).to_not be_nil
16
+ expect(FileTest.exists?(panel_import_file.temp_file)).to be true
17
+ end
18
+
19
+ it 'contains a header' do
20
+ expect(File.read(panel_import_file.temp_file)).to include("first_name")
21
+ end
22
+
23
+ it 'contains a row of recipients' do
24
+ expect(File.read(panel_import_file.temp_file)).to include(email)
25
+ end
26
+ end