confluence-soap 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +8 -1
- data/Gemfile.lock +44 -6
- data/README.md +20 -1
- data/VERSION +1 -1
- data/config/confluence.yml.example +4 -0
- data/confluence-soap.gemspec +18 -5
- data/lib/confluence-soap.rb +91 -43
- data/spec/confluence-soap_spec.rb +102 -119
- data/spec/spec_helper.rb +43 -1
- metadata +64 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 833da3e2d59c0f3a7244562cb72b2711613ccf60
|
4
|
+
data.tar.gz: dc911c4d3142cba6e141c827b297ae98a8a699ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 574e10ad50fe1de0896b3db19f540415754c91fbc94c3849f1fe4c217d70f80baa7b2baf967aad957539346125d316059a798fda575b340f7f6f53828bc157ab
|
7
|
+
data.tar.gz: 16b3a22ee6b0274f3b161fee88b39b7e605596202dd2657b028495d1704688f33ef629d8c419182c4e1fb5ce5b496b3fe287eb2b0dc339453b3fbc364294cacd
|
data/Gemfile
CHANGED
@@ -1,13 +1,20 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
|
-
gem 'savon'
|
2
|
+
gem 'savon', '~> 2.3.3'
|
3
3
|
|
4
4
|
group :development do
|
5
5
|
gem "bundler", "~> 1.0"
|
6
6
|
gem "jeweler", "~> 2.0.0"
|
7
7
|
gem "rdoc", "~> 3.12"
|
8
|
+
gem "pry-debugger"
|
9
|
+
gem "pry-stack_explorer"
|
10
|
+
gem "yard"
|
11
|
+
gem "redcarpet"
|
8
12
|
end
|
9
13
|
|
10
14
|
group :test do
|
11
15
|
gem "rspec", "~> 2.8.0"
|
12
16
|
gem "simplecov"
|
17
|
+
|
18
|
+
gem 'vcr', '~> 2.8.0'
|
19
|
+
gem 'webmock', '~> 1.15.0'
|
13
20
|
end
|
data/Gemfile.lock
CHANGED
@@ -2,17 +2,30 @@ GEM
|
|
2
2
|
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
4
|
addressable (2.3.5)
|
5
|
-
akami (1.2.
|
5
|
+
akami (1.2.1)
|
6
6
|
gyoku (>= 0.4.0)
|
7
|
-
nokogiri
|
7
|
+
nokogiri
|
8
|
+
binding_of_caller (0.7.2)
|
9
|
+
debug_inspector (>= 0.0.1)
|
8
10
|
builder (3.2.2)
|
11
|
+
coderay (1.1.0)
|
12
|
+
columnize (0.3.6)
|
13
|
+
crack (0.4.2)
|
14
|
+
safe_yaml (~> 1.0.0)
|
15
|
+
debug_inspector (0.0.2)
|
16
|
+
debugger (1.6.5)
|
17
|
+
columnize (>= 0.3.1)
|
18
|
+
debugger-linecache (~> 1.2.0)
|
19
|
+
debugger-ruby_core_source (~> 1.3.1)
|
20
|
+
debugger-linecache (1.2.0)
|
21
|
+
debugger-ruby_core_source (1.3.1)
|
9
22
|
descendants_tracker (0.0.3)
|
10
23
|
diff-lcs (1.1.3)
|
11
|
-
docile (1.1.
|
24
|
+
docile (1.1.3)
|
12
25
|
faraday (0.9.0)
|
13
26
|
multipart-post (>= 1.2, < 3)
|
14
27
|
git (1.2.6)
|
15
|
-
github_api (0.11.
|
28
|
+
github_api (0.11.2)
|
16
29
|
addressable (~> 2.3)
|
17
30
|
descendants_tracker (~> 0.0.1)
|
18
31
|
faraday (~> 0.8, < 0.10)
|
@@ -27,7 +40,7 @@ GEM
|
|
27
40
|
httpi (2.1.0)
|
28
41
|
rack
|
29
42
|
rubyntlm (~> 0.3.2)
|
30
|
-
jeweler (2.0.
|
43
|
+
jeweler (2.0.1)
|
31
44
|
builder
|
32
45
|
bundler (>= 1.0)
|
33
46
|
git (>= 1.2.5)
|
@@ -39,6 +52,7 @@ GEM
|
|
39
52
|
json (1.8.1)
|
40
53
|
jwt (0.1.11)
|
41
54
|
multi_json (>= 1.5)
|
55
|
+
method_source (0.8.2)
|
42
56
|
mime-types (1.25.1)
|
43
57
|
mini_portile (0.5.2)
|
44
58
|
multi_json (1.8.4)
|
@@ -53,10 +67,21 @@ GEM
|
|
53
67
|
multi_json (~> 1.3)
|
54
68
|
multi_xml (~> 0.5)
|
55
69
|
rack (~> 1.2)
|
70
|
+
pry (0.9.12.6)
|
71
|
+
coderay (~> 1.0)
|
72
|
+
method_source (~> 0.8)
|
73
|
+
slop (~> 3.4)
|
74
|
+
pry-debugger (0.2.2)
|
75
|
+
debugger (~> 1.3)
|
76
|
+
pry (~> 0.9.10)
|
77
|
+
pry-stack_explorer (0.4.9.1)
|
78
|
+
binding_of_caller (>= 0.7)
|
79
|
+
pry (>= 0.9.11)
|
56
80
|
rack (1.5.2)
|
57
81
|
rake (10.1.1)
|
58
82
|
rdoc (3.12.2)
|
59
83
|
json (~> 1.4)
|
84
|
+
redcarpet (3.0.0)
|
60
85
|
rspec (2.8.0)
|
61
86
|
rspec-core (~> 2.8.0)
|
62
87
|
rspec-expectations (~> 2.8.0)
|
@@ -66,6 +91,7 @@ GEM
|
|
66
91
|
diff-lcs (~> 1.1.2)
|
67
92
|
rspec-mocks (2.8.0)
|
68
93
|
rubyntlm (0.3.4)
|
94
|
+
safe_yaml (1.0.1)
|
69
95
|
savon (2.3.3)
|
70
96
|
akami (~> 1.2.0)
|
71
97
|
builder (>= 2.1.2)
|
@@ -79,10 +105,16 @@ GEM
|
|
79
105
|
multi_json
|
80
106
|
simplecov-html (~> 0.8.0)
|
81
107
|
simplecov-html (0.8.0)
|
108
|
+
slop (3.4.7)
|
109
|
+
vcr (2.8.0)
|
82
110
|
wasabi (3.2.3)
|
83
111
|
httpi (~> 2.0)
|
84
112
|
mime-types (< 2.0.0)
|
85
113
|
nokogiri (>= 1.4.0)
|
114
|
+
webmock (1.15.2)
|
115
|
+
addressable (>= 2.2.7)
|
116
|
+
crack (>= 0.3.2)
|
117
|
+
yard (0.8.7.3)
|
86
118
|
|
87
119
|
PLATFORMS
|
88
120
|
ruby
|
@@ -90,7 +122,13 @@ PLATFORMS
|
|
90
122
|
DEPENDENCIES
|
91
123
|
bundler (~> 1.0)
|
92
124
|
jeweler (~> 2.0.0)
|
125
|
+
pry-debugger
|
126
|
+
pry-stack_explorer
|
93
127
|
rdoc (~> 3.12)
|
128
|
+
redcarpet
|
94
129
|
rspec (~> 2.8.0)
|
95
|
-
savon
|
130
|
+
savon (~> 2.3.3)
|
96
131
|
simplecov
|
132
|
+
vcr (~> 2.8.0)
|
133
|
+
webmock (~> 1.15.0)
|
134
|
+
yard
|
data/README.md
CHANGED
@@ -3,7 +3,26 @@ confluence-soap
|
|
3
3
|
|
4
4
|
Ruby client for Confluence's SOAP API
|
5
5
|
|
6
|
-
http://<confluence-install>/rpc/soap-axis/confluenceservice-v2?wsdl
|
6
|
+
http://<confluence-install>/wiki/rpc/soap-axis/confluenceservice-v2?wsdl
|
7
|
+
|
8
|
+
## Example Usage
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
require 'confluence-soap'
|
12
|
+
|
13
|
+
cs = ConfluenceSoap.new("http://<confluence-install>/wiki/rpc/soap-axis/confluenceservice-v2?wsdl",
|
14
|
+
"user", "password")
|
15
|
+
|
16
|
+
cs.get_pages("name_of_your_space")
|
17
|
+
```
|
18
|
+
## Running the specs
|
19
|
+
|
20
|
+
First:
|
21
|
+
`cp config/confluence.yml.example config/confluence.yml`
|
22
|
+
|
23
|
+
Then edit `config/confluence.yml` to match your instance's settings.
|
24
|
+
You should create a separate confluence space for the specs to run
|
25
|
+
against, as running the specs will delete all pages in that space.
|
7
26
|
|
8
27
|
## Contributing to confluence-soap
|
9
28
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.9
|
data/confluence-soap.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "confluence-soap"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.9"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ping Yu", "Eric Himmelreich"]
|
12
|
-
s.date = "2014-
|
12
|
+
s.date = "2014-02-10"
|
13
13
|
s.description = ""
|
14
14
|
s.email = ["ping@intridea.com", "eric@intridea.com"]
|
15
15
|
s.extra_rdoc_files = [
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
"README.md",
|
27
27
|
"Rakefile",
|
28
28
|
"VERSION",
|
29
|
+
"config/confluence.yml.example",
|
29
30
|
"confluence-soap.gemspec",
|
30
31
|
"lib/confluence-soap.rb",
|
31
32
|
"spec/confluence-soap_spec.rb",
|
@@ -41,21 +42,33 @@ Gem::Specification.new do |s|
|
|
41
42
|
s.specification_version = 4
|
42
43
|
|
43
44
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
-
s.add_runtime_dependency(%q<savon>, ["
|
45
|
+
s.add_runtime_dependency(%q<savon>, ["~> 2.3.3"])
|
45
46
|
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
46
47
|
s.add_development_dependency(%q<jeweler>, ["~> 2.0.0"])
|
47
48
|
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
49
|
+
s.add_development_dependency(%q<pry-debugger>, [">= 0"])
|
50
|
+
s.add_development_dependency(%q<pry-stack_explorer>, [">= 0"])
|
51
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
52
|
+
s.add_development_dependency(%q<redcarpet>, [">= 0"])
|
48
53
|
else
|
49
|
-
s.add_dependency(%q<savon>, ["
|
54
|
+
s.add_dependency(%q<savon>, ["~> 2.3.3"])
|
50
55
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
51
56
|
s.add_dependency(%q<jeweler>, ["~> 2.0.0"])
|
52
57
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
58
|
+
s.add_dependency(%q<pry-debugger>, [">= 0"])
|
59
|
+
s.add_dependency(%q<pry-stack_explorer>, [">= 0"])
|
60
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
61
|
+
s.add_dependency(%q<redcarpet>, [">= 0"])
|
53
62
|
end
|
54
63
|
else
|
55
|
-
s.add_dependency(%q<savon>, ["
|
64
|
+
s.add_dependency(%q<savon>, ["~> 2.3.3"])
|
56
65
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
57
66
|
s.add_dependency(%q<jeweler>, ["~> 2.0.0"])
|
58
67
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
68
|
+
s.add_dependency(%q<pry-debugger>, [">= 0"])
|
69
|
+
s.add_dependency(%q<pry-stack_explorer>, [">= 0"])
|
70
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
71
|
+
s.add_dependency(%q<redcarpet>, [">= 0"])
|
59
72
|
end
|
60
73
|
end
|
61
74
|
|
data/lib/confluence-soap.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'savon'
|
2
2
|
|
3
3
|
class ConfluenceSoap
|
4
|
+
module Error; end
|
5
|
+
|
4
6
|
attr_reader :client, :token, :user
|
5
7
|
|
6
8
|
Page = Struct.new(:content, :content_status, :created, :creator, :current,
|
@@ -22,103 +24,149 @@ class ConfluenceSoap
|
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
25
|
-
def initialize(url, user, password)
|
27
|
+
def initialize(url, user, password, opts = {})
|
28
|
+
opts = opts.merge(wsdl: url)
|
26
29
|
@user = user
|
27
30
|
@password = password
|
28
|
-
@client = Savon.client(
|
31
|
+
@client = Savon.client(opts) do
|
29
32
|
convert_request_keys_to :lower_camelcase
|
30
33
|
end
|
31
|
-
@token = login
|
34
|
+
@token = login
|
32
35
|
end
|
33
36
|
|
34
|
-
def login
|
35
|
-
response =
|
36
|
-
@token = response
|
37
|
+
def login
|
38
|
+
response = client.call(:login, message: {in0: @user, in1: @password})
|
39
|
+
@token = parse_response(:login, response)
|
37
40
|
end
|
38
41
|
|
39
42
|
def logout
|
40
|
-
|
43
|
+
client.call(:logout, message: {in0: @token}) if @token
|
41
44
|
end
|
42
45
|
|
43
46
|
def get_pages(space)
|
44
|
-
response =
|
45
|
-
|
47
|
+
response = execute do
|
48
|
+
client.call(:get_pages, auth_message({in1: space}))
|
49
|
+
end
|
50
|
+
|
51
|
+
pages = parse_array_response(:get_pages, response)
|
46
52
|
pages.map { |page| Page.from_hash(page) }
|
47
53
|
end
|
48
54
|
|
49
55
|
def get_page(page_id)
|
50
|
-
response =
|
51
|
-
|
56
|
+
response = execute do
|
57
|
+
client.call(:get_page, auth_message({in1: page_id}))
|
58
|
+
end
|
59
|
+
|
60
|
+
Page.from_hash(parse_response(:get_page, response))
|
52
61
|
end
|
53
62
|
|
54
63
|
def get_children(page_id)
|
55
|
-
response =
|
56
|
-
|
64
|
+
response = execute do
|
65
|
+
client.call(:get_children, auth_message({in1: page_id}))
|
66
|
+
end
|
67
|
+
|
68
|
+
pages = parse_array_response(:get_children, response)
|
57
69
|
pages.map { |page| Page.from_hash(page) }
|
58
70
|
end
|
59
71
|
|
60
72
|
def store_page(page)
|
61
|
-
response =
|
62
|
-
|
73
|
+
response = execute do
|
74
|
+
client.call(:store_page, auth_message({in1: page.to_soap}))
|
75
|
+
end
|
76
|
+
|
77
|
+
Page.from_hash(parse_response(:store_page, response))
|
63
78
|
end
|
64
79
|
|
65
80
|
def update_page(page)
|
66
|
-
response =
|
67
|
-
|
68
|
-
|
69
|
-
|
81
|
+
response = execute do
|
82
|
+
client.call(:update_page,
|
83
|
+
auth_message({in1: page.to_soap, in2: {minorEdit: true} }))
|
84
|
+
end
|
85
|
+
|
86
|
+
Page.from_hash(parse_response(:update_page, response))
|
70
87
|
end
|
71
88
|
|
72
89
|
def remove_page(page_id)
|
73
|
-
response =
|
74
|
-
|
90
|
+
response = execute do
|
91
|
+
client.call(:remove_page, auth_message({in1: page_id}))
|
92
|
+
end
|
93
|
+
|
94
|
+
parse_response(:remove_page, response)
|
75
95
|
end
|
76
96
|
|
77
97
|
def search(term, criteria = {})
|
78
98
|
limit = criteria.delete(:limit) || 20
|
79
99
|
criteria = criteria.map { |k, v| {key: k, value: v} }
|
80
|
-
response =
|
81
|
-
|
82
|
-
|
83
|
-
|
100
|
+
response = execute do
|
101
|
+
client.call(:search,
|
102
|
+
auth_message({in1: term, in2: {item: criteria}, in3: limit}))
|
103
|
+
end
|
104
|
+
|
105
|
+
pages = parse_array_response(:search, response)
|
84
106
|
pages.map { |page| Page.from_hash(page) }
|
85
107
|
end
|
86
108
|
|
87
109
|
def add_label_by_name(label, page_id)
|
88
|
-
response =
|
89
|
-
|
110
|
+
response = execute do
|
111
|
+
client.call(:add_label_by_name, auth_message({in1: label, in2: page_id}))
|
112
|
+
end
|
90
113
|
|
91
114
|
parse_response(:add_label_by_name, response)
|
92
115
|
end
|
93
116
|
|
94
117
|
def remove_label_by_name(label, page_id)
|
95
|
-
response =
|
96
|
-
|
97
|
-
|
118
|
+
response = execute do
|
119
|
+
client.call(:remove_label_by_name,
|
120
|
+
auth_message({in1: label, in2: page_id}))
|
121
|
+
end
|
98
122
|
|
99
123
|
parse_response(:remove_label_by_name, response)
|
100
124
|
end
|
101
125
|
|
102
|
-
def has_user(user)
|
103
|
-
response =
|
126
|
+
def has_user?(user)
|
127
|
+
response = execute do
|
128
|
+
client.call(:has_user, auth_message({in1: user}))
|
129
|
+
end
|
130
|
+
|
104
131
|
parse_response(:has_user, response)
|
105
132
|
end
|
106
133
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
134
|
+
private
|
135
|
+
|
136
|
+
def execute
|
137
|
+
if block_given?
|
138
|
+
yield
|
139
|
+
else
|
140
|
+
tag_errors { raise StandardError.new('requires a block') }
|
141
|
+
end
|
142
|
+
rescue Exception => e
|
143
|
+
if invalid_session?(e)
|
144
|
+
reconnect
|
145
|
+
# @note necessary for catching an invalid session, and then a
|
146
|
+
# Savon::SOAPFault on the same request
|
147
|
+
tag_errors { yield e }
|
148
|
+
else
|
149
|
+
tag_errors { raise e }
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def invalid_session?(exception)
|
154
|
+
if exception.respond_to?(:to_hash)
|
155
|
+
fault = exception.to_hash.fetch(:fault) { {} }
|
156
|
+
|
157
|
+
fault[:faultstring] =~ /InvalidSessionException/
|
158
|
+
end
|
116
159
|
end
|
117
160
|
|
118
|
-
|
161
|
+
def tag_errors
|
162
|
+
yield
|
163
|
+
rescue Exception => e
|
164
|
+
e.extend(ConfluenceSoap::Error)
|
165
|
+
raise
|
166
|
+
end
|
119
167
|
|
120
168
|
def reconnect
|
121
|
-
|
169
|
+
@token = login
|
122
170
|
end
|
123
171
|
|
124
172
|
def parse_array_response(method, response)
|
@@ -1,183 +1,166 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ConfluenceSoap do
|
4
|
-
let (:url) {
|
5
|
-
|
4
|
+
let (:url) { ConfluenceConfig[:url] }
|
5
|
+
let(:space) { ConfluenceConfig[:space] }
|
6
|
+
let(:page) do
|
7
|
+
ConfluenceSoap::Page.from_hash({content: 'test', title: 'Testing API ',
|
8
|
+
space: ConfluenceConfig[:space],
|
9
|
+
permissions: 0})
|
10
|
+
end
|
11
|
+
|
12
|
+
subject do
|
13
|
+
ConfluenceSoap.new(url, ConfluenceConfig[:user],
|
14
|
+
ConfluenceConfig[:password],
|
15
|
+
log: false)
|
6
16
|
|
7
|
-
describe 'Page' do
|
8
|
-
ConfluenceSoap::Page.new.to_h
|
9
17
|
end
|
10
18
|
|
19
|
+
shared_context 'invalidate session to force a reconnect' do
|
20
|
+
before(:each) do
|
21
|
+
ignore_request do
|
22
|
+
@token = subject.token
|
23
|
+
|
24
|
+
subject.client.stub(:call)
|
25
|
+
.and_return(double(body:
|
26
|
+
{login_response:
|
27
|
+
{login_return: 'invalid_token'}}))
|
28
|
+
subject.login
|
29
|
+
subject.client.unstub(:call)
|
30
|
+
subject.stub(:login).and_return(@token)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
11
36
|
describe '#initialize' do
|
12
|
-
it '
|
13
|
-
Savon.should_receive(:client).with(wsdl: url)
|
37
|
+
it 'creates a savon soap client with url provided' do
|
14
38
|
ConfluenceSoap.any_instance.should_receive(:login)
|
39
|
+
Savon.should_receive(:client)
|
15
40
|
|
16
41
|
subject
|
17
42
|
end
|
18
43
|
end
|
19
44
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
.with(:login, message: {in0: 'user', in1: 'password'})
|
24
|
-
.and_return(double(:response, body: {login_response: {login_return: 'token'}}))
|
25
|
-
end
|
45
|
+
context 'when #login repeatedly fails' do
|
46
|
+
it 'should raise the library error' do
|
47
|
+
ConfluenceSoap.any_instance.stub(:login).and_return('invalid-token')
|
26
48
|
|
27
|
-
|
28
|
-
|
29
|
-
|
49
|
+
VCR.use_cassette(:repeated_login_failures) do
|
50
|
+
lambda {
|
51
|
+
subject.get_pages(space)
|
52
|
+
}.should raise_error(ConfluenceSoap::Error)
|
53
|
+
end
|
30
54
|
end
|
55
|
+
end
|
31
56
|
|
32
|
-
|
33
|
-
|
57
|
+
describe '#login' do
|
58
|
+
it 'stores the session token' do
|
59
|
+
VCR.use_cassette(:login) do
|
60
|
+
subject.login
|
61
|
+
end
|
34
62
|
|
35
|
-
subject.token.
|
63
|
+
subject.token.should_not be_nil
|
36
64
|
end
|
37
65
|
end
|
38
66
|
|
39
67
|
describe 'with an authenticated user' do
|
40
|
-
|
41
|
-
ConfluenceSoap.any_instance.stub(:login).and_return('token')
|
42
|
-
end
|
43
|
-
|
44
|
-
describe '#get_pages' do
|
45
|
-
let(:space) { 'SpaceName' }
|
46
|
-
before (:each) do
|
68
|
+
include_context 'invalidate session to force a reconnect'
|
47
69
|
|
48
|
-
|
49
|
-
|
50
|
-
|
70
|
+
describe '#store_page' do
|
71
|
+
it 'stores the page and returns it' do
|
72
|
+
ignore_request do
|
73
|
+
subject.store_page(page).should be_instance_of(ConfluenceSoap::Page)
|
74
|
+
end
|
51
75
|
end
|
52
76
|
|
53
|
-
|
54
|
-
|
77
|
+
context 'when the page already exists' do
|
78
|
+
it 'should raise the library error' do
|
79
|
+
ignore_request do
|
80
|
+
lambda { subject.store_page(page) }
|
81
|
+
.should raise_error(ConfluenceSoap::Error)
|
82
|
+
end
|
83
|
+
end
|
55
84
|
end
|
56
85
|
end
|
57
86
|
|
58
|
-
describe '#
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
.and_return(double(:response, body: {get_page_response: {get_page_return: {}}}))
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'should return the page' do
|
67
|
-
subject.get_page page_id
|
87
|
+
describe '#get_pages' do
|
88
|
+
it 'should return the pages in the space' do
|
89
|
+
VCR.use_cassette(:get_pages) do
|
90
|
+
subject.get_pages(space).size.should == 1
|
91
|
+
end
|
68
92
|
end
|
69
93
|
end
|
70
94
|
|
71
95
|
describe '#get_page' do
|
72
|
-
let(:page_id) { '123456' }
|
73
|
-
before (:each) do
|
74
|
-
subject.client.should_receive(:call)
|
75
|
-
.with(:remove_page, message: {in0: 'token', in1: page_id})
|
76
|
-
.and_return(double(:response, body: {remove_page_response: {remove_page_return: {}}}))
|
77
|
-
end
|
78
|
-
|
79
96
|
it 'should return the page' do
|
80
|
-
|
97
|
+
VCR.use_cassette(:get_first_page) do
|
98
|
+
subject.get_pages(space).first.id.should_not be_nil
|
99
|
+
end
|
81
100
|
end
|
82
101
|
end
|
83
|
-
describe '#get_children' do
|
84
|
-
before (:each) do
|
85
|
-
subject.client.should_receive(:call)
|
86
|
-
.with(:get_children, message: {in0: 'token', in1: 'page_id'})
|
87
|
-
.and_return(double(:response, body: {get_children_response: {get_children_return: {get_children_return: []}}}))
|
88
|
-
end
|
89
102
|
|
103
|
+
describe '#get_children' do
|
90
104
|
it 'should return array of child pages' do
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
describe '#store_page' do
|
96
|
-
let(:page) do
|
97
|
-
ConfluenceSoap::Page.from_hash({content: 'test', title: 'Testing API ', space: 'Space Name',
|
98
|
-
parent_id: 'parent_id', permissions: 0})
|
99
|
-
end
|
100
|
-
|
101
|
-
before (:each) do
|
102
|
-
subject.client.should_receive(:call)
|
103
|
-
.with(:store_page, message: {in0: 'token', in1: {content: 'test', title: 'Testing API ',
|
104
|
-
space: 'Space Name', parent_id: 'parent_id', permissions: 0}})
|
105
|
-
.and_return(double(:response, body: {store_page_response: {store_page_return: {}}}))
|
106
|
-
end
|
105
|
+
VCR.use_cassette(:get_first_page_id) do
|
106
|
+
@page_id = subject.get_pages(space).first.id
|
107
|
+
end
|
107
108
|
|
108
|
-
|
109
|
-
|
109
|
+
VCR.use_cassette(:get_children) do
|
110
|
+
subject.get_children(@page_id).should == []
|
111
|
+
end
|
110
112
|
end
|
111
113
|
end
|
112
114
|
|
113
115
|
describe '#update_page' do
|
114
|
-
let(:page) do
|
115
|
-
ConfluenceSoap::Page.from_hash({content: 'test', title: 'Testing API ', space: 'Space Name',
|
116
|
-
parent_id: 'parent_id', permissions: 0})
|
117
|
-
end
|
118
|
-
|
119
|
-
before (:each) do
|
120
|
-
subject.client.should_receive(:call)
|
121
|
-
.with(:update_page, message: {in0: 'token', in1: {content: 'test', title: 'Testing API ',
|
122
|
-
space: 'Space Name', parent_id: 'parent_id', permissions: 0},
|
123
|
-
in2: {minorEdit: true}})
|
124
|
-
.and_return(double(:response, body: {update_page_response: {update_page_return: {}}}))
|
125
|
-
end
|
126
|
-
|
127
116
|
it 'should store page with savon' do
|
128
|
-
|
117
|
+
ignore_request do
|
118
|
+
@page = subject.get_pages(space).first
|
119
|
+
end
|
120
|
+
|
121
|
+
VCR.use_cassette(:update_page) do
|
122
|
+
@page.content = 'my edits'
|
123
|
+
subject.update_page(@page).should be_instance_of(ConfluenceSoap::Page)
|
124
|
+
end
|
129
125
|
end
|
130
126
|
end
|
131
127
|
|
132
128
|
describe '#search' do
|
133
|
-
let(:term) { 'search term' }
|
134
|
-
let(:criteria) { {item: [{key: :space_key, value: 'SpaceName'}]} }
|
135
|
-
before (:each) do
|
136
|
-
subject.client.should_receive(:call)
|
137
|
-
.with(:search,
|
138
|
-
message: {in0: 'token', in1: term, in2: criteria, in3: 20})
|
139
|
-
.and_return(double(:response, body: {search_response: {search_return: {search_return: []}}}))
|
140
|
-
end
|
141
|
-
|
142
129
|
it 'should search with savon' do
|
143
|
-
|
130
|
+
VCR.use_cassette(:search_without_results) do
|
131
|
+
subject.search('Intridea',
|
132
|
+
{type: 'page', spaceKey: ConfluenceConfig[:space]})
|
133
|
+
.should == []
|
134
|
+
end
|
144
135
|
end
|
145
136
|
end
|
146
137
|
|
147
138
|
describe '#add_label_by_name' do
|
148
|
-
before(:each) do
|
149
|
-
subject.client.should_receive(:call)
|
150
|
-
.with(:add_label_by_name, message: {in0: 'token', in1: 'faq', in2: 1})
|
151
|
-
.and_return(double(:response, body: {add_label_by_name_response: {add_label_by_name_return: true}}))
|
152
|
-
end
|
153
|
-
|
154
139
|
it 'should add a label to the page' do
|
155
|
-
|
140
|
+
ignore_request do
|
141
|
+
page_id = subject.get_pages(space).first.id
|
142
|
+
|
143
|
+
subject.add_label_by_name('faq', page_id).should == true
|
144
|
+
end
|
156
145
|
end
|
157
146
|
end
|
158
147
|
|
159
148
|
describe '#remove_label_by_name' do
|
160
|
-
before(:each) do
|
161
|
-
subject.client.should_receive(:call)
|
162
|
-
.with(:remove_label_by_name, message: {in0: 'token', in1: 'faq', in2: 1})
|
163
|
-
.and_return(double(:response, body: {remove_label_by_name_response: {remove_label_by_name_return: true}}))
|
164
|
-
end
|
165
|
-
|
166
149
|
it 'should remove a label from the page' do
|
167
|
-
|
150
|
+
ignore_request do
|
151
|
+
page_id = subject.get_pages(space).first.id
|
152
|
+
|
153
|
+
subject.remove_label_by_name('faq', page_id).should == true
|
154
|
+
end
|
168
155
|
end
|
169
156
|
end
|
170
157
|
|
171
|
-
describe '#
|
172
|
-
|
173
|
-
|
174
|
-
|
158
|
+
describe '#remove_page' do
|
159
|
+
it 'should remove the page' do
|
160
|
+
ignore_request do
|
161
|
+
page_id = subject.get_pages(space).first.id
|
175
162
|
|
176
|
-
|
177
|
-
Savon::SOAPFault.any_instance.stub(:to_hash).and_return({fault: {faultstring: 'InvalidSessionException'}})
|
178
|
-
ex = Savon::SOAPFault.new nil, nil
|
179
|
-
subject.execute do |x|
|
180
|
-
raise ex if x.is_a? ConfluenceSoap
|
163
|
+
subject.remove_page(page_id).should == true
|
181
164
|
end
|
182
165
|
end
|
183
166
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,11 +2,53 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
2
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
3
|
require 'rspec'
|
4
4
|
require 'confluence-soap'
|
5
|
+
require 'vcr'
|
5
6
|
|
6
7
|
# Requires supporting files with custom matchers and macros, etc,
|
7
8
|
# in ./support/ and its subdirectories.
|
8
9
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
10
|
|
11
|
+
ConfluenceConfig = YAML.load(File.read("config/confluence.yml"))
|
12
|
+
|
10
13
|
RSpec.configure do |config|
|
11
|
-
|
14
|
+
config.before(:suite) do
|
15
|
+
ignore_request { delete_all_pages_in_test_space }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
VCR.configure do |c|
|
20
|
+
c.cassette_library_dir = 'spec/support/vcr_cassettes'
|
21
|
+
c.hook_into :webmock # or :fakeweb
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete_all_pages_in_test_space
|
25
|
+
client = Savon.client(wsdl: ConfluenceConfig[:url], log: false) do
|
26
|
+
convert_request_keys_to :lower_camelcase
|
27
|
+
end
|
28
|
+
token = client.call(:login, message: {
|
29
|
+
in0: ConfluenceConfig[:user],
|
30
|
+
in1: ConfluenceConfig[:password]
|
31
|
+
}).body[:login_response][:login_return]
|
32
|
+
pages = client.call(:get_pages, message: {
|
33
|
+
in0: token,
|
34
|
+
in1: ConfluenceConfig[:space]
|
35
|
+
})
|
36
|
+
pages =
|
37
|
+
pages.body[:get_pages_response][:get_pages_return][:get_pages_return] || []
|
38
|
+
pages = pages.respond_to?(:to_hash) ? [pages] : pages
|
39
|
+
|
40
|
+
pages.each do |page|
|
41
|
+
client.call(:remove_page, message: {in0: token, in1: page[:id]})
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# @note https://github.com/vcr/vcr/issues/181#issuecomment-7016463
|
46
|
+
def ignore_request
|
47
|
+
VCR.turned_off do
|
48
|
+
WebMock.allow_net_connect!
|
49
|
+
|
50
|
+
yield
|
51
|
+
|
52
|
+
WebMock.disable_net_connect!
|
53
|
+
end
|
12
54
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: confluence-soap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ping Yu
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-02-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: savon
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ~>
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: 2.3.3
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ~>
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: 2.3.3
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: bundler
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,6 +67,62 @@ dependencies:
|
|
67
67
|
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '3.12'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: pry-debugger
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: pry-stack_explorer
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: yard
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: redcarpet
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
70
126
|
description: ''
|
71
127
|
email:
|
72
128
|
- ping@intridea.com
|
@@ -86,6 +142,7 @@ files:
|
|
86
142
|
- README.md
|
87
143
|
- Rakefile
|
88
144
|
- VERSION
|
145
|
+
- config/confluence.yml.example
|
89
146
|
- confluence-soap.gemspec
|
90
147
|
- lib/confluence-soap.rb
|
91
148
|
- spec/confluence-soap_spec.rb
|
@@ -115,3 +172,4 @@ signing_key:
|
|
115
172
|
specification_version: 4
|
116
173
|
summary: ruby client for confluence soap API
|
117
174
|
test_files: []
|
175
|
+
has_rdoc:
|