discourse_api 0.39.2 → 0.43.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +54 -0
  3. data/.gitignore +0 -2
  4. data/.rubocop.yml +2 -6
  5. data/CHANGELOG.md +38 -8
  6. data/README.md +13 -2
  7. data/discourse_api.gemspec +4 -6
  8. data/examples/change_topic_status.rb +3 -4
  9. data/examples/create_topic.rb +10 -0
  10. data/lib/discourse_api/api/api_key.rb +0 -8
  11. data/lib/discourse_api/api/categories.rb +9 -2
  12. data/lib/discourse_api/api/groups.rb +10 -2
  13. data/lib/discourse_api/api/sso.rb +1 -15
  14. data/lib/discourse_api/api/topics.rb +8 -2
  15. data/lib/discourse_api/client.rb +20 -4
  16. data/lib/discourse_api/single_sign_on.rb +32 -3
  17. data/lib/discourse_api/version.rb +1 -1
  18. data/spec/discourse_api/api/api_key_spec.rb +2 -28
  19. data/spec/discourse_api/api/backups_spec.rb +2 -1
  20. data/spec/discourse_api/api/badges_spec.rb +2 -1
  21. data/spec/discourse_api/api/categories_spec.rb +9 -8
  22. data/spec/discourse_api/api/email_spec.rb +2 -1
  23. data/spec/discourse_api/api/groups_spec.rb +7 -6
  24. data/spec/discourse_api/api/notifications_spec.rb +1 -0
  25. data/spec/discourse_api/api/params_spec.rb +8 -7
  26. data/spec/discourse_api/api/polls_spec.rb +7 -6
  27. data/spec/discourse_api/api/posts_spec.rb +1 -0
  28. data/spec/discourse_api/api/private_messages_spec.rb +1 -0
  29. data/spec/discourse_api/api/search_spec.rb +4 -3
  30. data/spec/discourse_api/api/site_settings_spec.rb +2 -1
  31. data/spec/discourse_api/api/sso_spec.rb +46 -3
  32. data/spec/discourse_api/api/topics_spec.rb +20 -1
  33. data/spec/discourse_api/api/uploads_spec.rb +1 -0
  34. data/spec/discourse_api/api/user_actions_spec.rb +1 -0
  35. data/spec/discourse_api/api/users_spec.rb +4 -3
  36. data/spec/discourse_api/client_spec.rb +11 -10
  37. data/spec/fixtures/create_topic_with_tags.json +65 -0
  38. data/spec/spec_helper.rb +2 -1
  39. metadata +17 -45
  40. data/.travis.yml +0 -11
  41. data/spec/fixtures/generate_api_key.json +0 -12
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module DiscourseApi
3
- VERSION = "0.39.2"
3
+ VERSION = "0.43.0"
4
4
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::ApiKey do
@@ -30,33 +31,6 @@ describe DiscourseApi::API::ApiKey do
30
31
  end
31
32
  end
32
33
 
33
- describe "#generate_user_api_key" do
34
- before do
35
- url = "#{host}/admin/users/2/generate_api_key.json"
36
- stub_post(url).to_return(body: fixture("generate_api_key.json"),
37
- headers: { content_type: "application/json" })
38
- end
39
-
40
- it "returns the generated api key" do
41
- api_key = subject.generate_user_api_key(2)
42
- expect(api_key).to be_a Hash
43
- expect(api_key['api_key']).to have_key('key')
44
- end
45
- end
46
-
47
- describe "#revoke_user_api_key" do
48
- before do
49
- url = "#{host}/admin/users/2/revoke_api_key.json"
50
- stub_delete(url).to_return(body: "",
51
- headers: { content_type: "application/json" })
52
- end
53
-
54
- it "returns 200" do
55
- response = subject.revoke_user_api_key(2)
56
- expect(response['status']).to eq(200)
57
- end
58
- end
59
-
60
34
  describe "#generate_master_key" do
61
35
  before do
62
36
  url = "#{host}/admin/api/key"
@@ -95,7 +69,7 @@ describe DiscourseApi::API::ApiKey do
95
69
  before do
96
70
  url = "#{host}/admin/api/key"
97
71
  stub_put(url).to_return(body: fixture("regenerate_api_key.json"),
98
- headers: { content_type: "application/json" })
72
+ headers: { content_type: "application/json" })
99
73
  end
100
74
 
101
75
  it "requests the correct resource" do
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Backups do
4
- subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user" )}
5
+ subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user") }
5
6
 
6
7
  describe "#backups" do
7
8
  before do
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Badges do
4
- subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user" )}
5
+ subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user") }
5
6
 
6
7
  describe "#badges" do
7
8
  before do
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Categories do
4
- subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user" )}
5
+ subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user") }
5
6
 
6
7
  describe "#categories" do
7
8
  before do
@@ -42,8 +43,8 @@ describe DiscourseApi::API::Categories do
42
43
  describe '#category_top_topics' do
43
44
  before do
44
45
  stub_get("#{host}/c/category-slug/l/top.json")
45
- .to_return(
46
- body: fixture("category_topics.json"),
46
+ .to_return(
47
+ body: fixture("category_topics.json"),
47
48
  headers: { content_type: "application/json" }
48
49
  )
49
50
  end
@@ -57,8 +58,8 @@ describe DiscourseApi::API::Categories do
57
58
  describe '#category_new_topics' do
58
59
  before do
59
60
  stub_get("#{host}/c/category-slug/l/new.json")
60
- .to_return(
61
- body: fixture("category_topics.json"),
61
+ .to_return(
62
+ body: fixture("category_topics.json"),
62
63
  headers: { content_type: "application/json" }
63
64
  )
64
65
  end
@@ -74,14 +75,14 @@ describe DiscourseApi::API::Categories do
74
75
  stub_post("#{host}/categories")
75
76
  subject.create_category(name: "test_category", color: "283890", text_color: "FFFFFF",
76
77
  description: "This is a description",
77
- permissions: {"group_1" => 1, "admins" => 1})
78
+ permissions: { "group_1" => 1, "admins" => 1 })
78
79
  end
79
-
80
+
80
81
  it "makes a create category request" do
81
82
  expect(a_post("#{host}/categories").with(body:
82
83
  "color=283890&description=This+is+a+description&name=test_category&parent_category_id&permissions%5Badmins%5D=1&permissions%5Bgroup_1%5D=1&text_color=FFFFFF")
83
84
  ).to have_been_made
84
85
  end
85
- end
86
+ end
86
87
 
87
88
  end
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Email do
4
- subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user" )}
5
+ subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user") }
5
6
 
6
7
  describe "#email_settings" do
7
8
  before do
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Groups do
4
- subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user" )}
5
+ subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user") }
5
6
 
6
7
  describe "#groups" do
7
8
  before do
@@ -51,28 +52,28 @@ describe DiscourseApi::API::Groups do
51
52
  it "adds a single member by username" do
52
53
  subject.group_add(123, username: "sam")
53
54
  expect(a_request(:put, "#{host}/admin/groups/123/members.json").
54
- with(body: {usernames: "sam"})
55
+ with(body: { usernames: "sam" })
55
56
  ).to have_been_made
56
57
  end
57
58
 
58
59
  it "adds an array of members by username" do
59
60
  subject.group_add(123, usernames: ["sam", "jeff"])
60
61
  expect(a_request(:put, "#{host}/admin/groups/123/members.json").
61
- with(body: {usernames: "sam,jeff"})
62
+ with(body: { usernames: "sam,jeff" })
62
63
  ).to have_been_made
63
64
  end
64
65
 
65
66
  it "adds a single member by user_id" do
66
67
  subject.group_add(123, user_id: 456)
67
68
  expect(a_request(:put, "#{host}/admin/groups/123/members.json").
68
- with(body: {user_ids: "456"})
69
+ with(body: { user_ids: "456" })
69
70
  ).to have_been_made
70
71
  end
71
72
 
72
73
  it "adds an array of members by user_id" do
73
74
  subject.group_add(123, user_id: [123, 456])
74
75
  expect(a_request(:put, "#{host}/admin/groups/123/members.json").
75
- with(body: {user_ids: "123,456"})
76
+ with(body: { user_ids: "123,456" })
76
77
  ).to have_been_made
77
78
  end
78
79
  end
@@ -122,7 +123,7 @@ describe DiscourseApi::API::Groups do
122
123
  it "updates user's notification level for group" do
123
124
  subject.group_set_user_notification_level("mygroup", 77, 3)
124
125
  expect(a_post("#{host}/groups/mygroup/notifications?user_id=77&notification_level=3"))
125
- .to have_been_made
126
+ .to have_been_made
126
127
  end
127
128
  end
128
129
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Notifications do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Params do
@@ -6,31 +7,31 @@ describe DiscourseApi::API::Params do
6
7
  end
7
8
 
8
9
  it "should raise on missing required params" do
9
- expect { params_for({o1: "test"}).to_h }.to raise_error(ArgumentError)
10
+ expect { params_for({ o1: "test" }).to_h }.to raise_error(ArgumentError)
10
11
  end
11
12
 
12
13
  it "should not raise when a required param is false" do
13
- expect { params_for({r1: false}).to_h }.not_to raise_error
14
+ expect { params_for({ r1: false }).to_h }.not_to raise_error
14
15
  end
15
16
 
16
17
  it "should not include optional params when not provided" do
17
- expect(params_for({r1: "test"}).to_h).not_to include(:o1)
18
+ expect(params_for({ r1: "test" }).to_h).not_to include(:o1)
18
19
  end
19
20
 
20
21
  it "should include optional params if provided but blank" do
21
- expect(params_for({r1: "test", o2: nil}).to_h).to include(:o2)
22
+ expect(params_for({ r1: "test", o2: nil }).to_h).to include(:o2)
22
23
  end
23
24
 
24
25
  it "should include default params when defined but not provided" do
25
- expect(params_for({r1: "test"}).to_h).to include(d1: "default")
26
+ expect(params_for({ r1: "test" }).to_h).to include(d1: "default")
26
27
  end
27
28
 
28
29
  it "should include default params when defined and provided" do
29
- expect(params_for({r1: "test", d1: "override"}).to_h).to include(d1: "override")
30
+ expect(params_for({ r1: "test", d1: "override" }).to_h).to include(d1: "override")
30
31
  end
31
32
 
32
33
  it "should include optional and default params when defined and provided" do
33
- expect(params_for({r1: "test", o1: "optional", d1: "override"}).to_h).to include(o1: "optional", d1: "override")
34
+ expect(params_for({ r1: "test", o1: "optional", d1: "override" }).to_h).to include(o1: "optional", d1: "override")
34
35
  end
35
36
 
36
37
  end
@@ -1,14 +1,15 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Polls do
4
- subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user" )}
5
+ subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user") }
5
6
 
6
7
  describe "#poll vote" do
7
8
  before do
8
9
  path = "#{host}/polls/vote"
9
10
  stub_put(path)
10
- .to_return(body: fixture("polls_vote.json"), headers: { content_type: "application/json" })
11
-
11
+ .to_return(body: fixture("polls_vote.json"), headers: { content_type: "application/json" })
12
+
12
13
  end
13
14
 
14
15
  it "requests the correct resource" do
@@ -29,7 +30,7 @@ describe DiscourseApi::API::Polls do
29
30
  before do
30
31
  path = "#{host}/polls/toggle_status"
31
32
  stub_put(path)
32
- .to_return(body: fixture("polls_toggle_status.json"), headers: { content_type: "application/json" })
33
+ .to_return(body: fixture("polls_toggle_status.json"), headers: { content_type: "application/json" })
33
34
 
34
35
  end
35
36
 
@@ -49,7 +50,7 @@ describe DiscourseApi::API::Polls do
49
50
  describe "#poll voters" do
50
51
  before do
51
52
  stub_get("#{host}/polls/voters.json?post_id=5&poll_name=poll")
52
- .to_return(body: fixture("polls_voters.json"), headers: { content_type: "application/json" })
53
+ .to_return(body: fixture("polls_voters.json"), headers: { content_type: "application/json" })
53
54
  end
54
55
 
55
56
  it "requests the correct resource" do
@@ -64,7 +65,7 @@ describe DiscourseApi::API::Polls do
64
65
  expect(voters['voters']['e539a9df8700d0d05c69356a07b768cf']).to be_an Array
65
66
  expect(voters['voters']['e539a9df8700d0d05c69356a07b768cf'][0]['id']).to eq(356)
66
67
  end
67
- end
68
+ end
68
69
 
69
70
  end
70
71
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Posts do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::PrivateMessages do
@@ -1,16 +1,17 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Search do
4
- subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user" )}
5
+ subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user") }
5
6
 
6
7
  describe "#search" do
7
8
  before do
8
- stub_get("#{host}/search/query").with(query: { term: "test"} ).to_return(body: fixture("search.json"), headers: { content_type: "application/json" })
9
+ stub_get("#{host}/search/query").with(query: { term: "test" }).to_return(body: fixture("search.json"), headers: { content_type: "application/json" })
9
10
  end
10
11
 
11
12
  it "requests the correct resource" do
12
13
  subject.search("test")
13
- expect(a_get("#{host}/search/query").with(query: { term: "test"} )).to have_been_made
14
+ expect(a_get("#{host}/search/query").with(query: { term: "test" })).to have_been_made
14
15
  end
15
16
 
16
17
  it "returns the requested search" do
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::SiteSettings do
4
- subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user" )}
5
+ subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user") }
5
6
 
6
7
  describe "#site_setting_update" do
7
8
  before do
@@ -1,15 +1,58 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::SSO do
4
- subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user" )}
5
+ subject { DiscourseApi::Client.new("#{host}", "test_d7fd0429940", "test_user") }
6
+
7
+ let(:params) do
8
+ {
9
+ sso_secret: 'abc',
10
+ sso_url: 'www.google.com',
11
+ name: 'Some User',
12
+ username: 'some_user',
13
+ email: 'some@email.com',
14
+ external_id: 'abc',
15
+ suppress_welcome_message: false,
16
+ avatar_url: 'https://www.website.com',
17
+ title: 'ruby',
18
+ avatar_force_update: false,
19
+ add_groups: ['a', 'b'],
20
+ remove_groups: ['c', 'd'],
21
+ # old format (which results in custom.custom.field_1 in unsigned_payload)
22
+ 'custom.field_1' => 'tomato',
23
+ # new format
24
+ custom_fields: {
25
+ field_2: 'potato'
26
+ }
27
+ }
28
+ end
29
+ let(:expected_unsigned_payload) do
30
+ 'name=Some+User&username=some_user&email=some%40email.com&'\
31
+ 'avatar_url=https%3A%2F%2Fwww.website.com&external_id=abc&title=ruby'\
32
+ '&add_groups=a&add_groups=b&remove_groups=c&remove_groups=d&custom.field_2=potato&'\
33
+ 'custom.custom.field_1=tomato'
34
+ end
35
+ let(:sso_double) { DiscourseApi::SingleSignOn.parse_hash(params) }
5
36
 
6
37
  describe "#sync_sso" do
7
38
  before do
8
- stub_post(/.*sync_sso.*/).to_return(body: fixture("user.json"), headers: { content_type: "application/json" })
39
+ stub_post(/.*sync_sso.*/).to_return(
40
+ body: fixture("user.json"),
41
+ headers: { content_type: "application/json" }
42
+ )
43
+ end
44
+
45
+ it 'assigns params to sso instance' do
46
+ allow(DiscourseApi::SingleSignOn).to(receive(:parse_hash).with(params).and_return(sso_double))
47
+
48
+ subject.sync_sso(params)
49
+
50
+ expect(sso_double.custom_fields).to eql({ 'custom.field_1' => 'tomato', :field_2 => 'potato' })
51
+ expect(sso_double.unsigned_payload).to eql(expected_unsigned_payload)
9
52
  end
10
53
 
11
54
  it "requests the correct resource" do
12
- subject.sync_sso({sso_secret: "test_d7fd0429940", "custom.riffle_url" => "test"})
55
+ subject.sync_sso({ sso_secret: "test_d7fd0429940", "custom.riffle_url" => "test" })
13
56
  expect(a_post(/.*sync_sso.*/)).to have_been_made
14
57
  end
15
58
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Topics do
@@ -9,7 +10,7 @@ describe DiscourseApi::API::Topics do
9
10
  end
10
11
 
11
12
  it "changes the topic status" do
12
- subject.change_topic_status(nil, 57, { status: 'visible', enabled: false })
13
+ subject.update_topic_status(57, { status: 'visible', enabled: false })
13
14
  expect(a_put("#{host}/t/57/status")).to have_been_made
14
15
  end
15
16
  end
@@ -147,4 +148,22 @@ describe DiscourseApi::API::Topics do
147
148
  expect(body['post_stream']['posts'].first).to be_a Hash
148
149
  end
149
150
  end
151
+
152
+ describe "#create_topic_with_tags" do
153
+ before do
154
+ stub_post("#{host}/posts").to_return(body: fixture("create_topic_with_tags.json"), headers: { content_type: "application/json" })
155
+ end
156
+
157
+ it "makes the post request" do
158
+ subject.create_topic title: "Sample Topic Title", raw: "Sample topic content body", tags: ["asdf", "fdsa"]
159
+ expect(a_post("#{host}/posts")).to have_been_made
160
+ end
161
+
162
+ it "returns success" do
163
+ response = subject.create_topic title: "Sample Topic Title", raw: "Sample topic content body", tags: ["asdf", "fdsa"]
164
+ expect(response).to be_a Hash
165
+ expect(response['topic_id']).to eq 21
166
+ end
167
+ end
168
+
150
169
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Uploads do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::UserActions do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe DiscourseApi::API::Users do
@@ -113,12 +114,12 @@ describe DiscourseApi::API::Users do
113
114
  end
114
115
 
115
116
  it "makes the post request" do
116
- subject.create_user :name => "Test User", :email => "test2@example.com", :password => "P@ssword", :username => "test2"
117
+ subject.create_user name: "Test User", email: "test2@example.com", password: "P@ssword", username: "test2"
117
118
  expect(a_post("#{host}/users")).to have_been_made
118
119
  end
119
120
 
120
121
  it "returns success" do
121
- response = subject.create_user :name => "Test User", :email => "test2@example.com", :password => "P@ssword", :username => "test2"
122
+ response = subject.create_user name: "Test User", email: "test2@example.com", password: "P@ssword", username: "test2"
122
123
  expect(response).to be_a Hash
123
124
  expect(response['success']).to be_truthy
124
125
  end
@@ -163,7 +164,7 @@ describe DiscourseApi::API::Users do
163
164
  end
164
165
 
165
166
  it "Raises API Error" do
166
- expect{subject.log_out(90)}.to raise_error DiscourseApi::NotFoundError
167
+ expect { subject.log_out(90) }.to raise_error DiscourseApi::NotFoundError
167
168
  end
168
169
  end
169
170