testlink-api-client 0.0.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 (64) hide show
  1. data/LICENSE +15 -0
  2. data/README.rdoc +14 -0
  3. data/features/create_test_suite.feature +90 -0
  4. data/features/get_first_level_test_suites_for_test_project.feature +25 -0
  5. data/features/get_projects.feature +47 -0
  6. data/features/get_test_suite_by_id.feature +24 -0
  7. data/features/get_test_suites_for_test_suite.feature +33 -0
  8. data/features/step_definitions/common.rb +69 -0
  9. data/features/step_definitions/create_test_suite.rb +14 -0
  10. data/features/step_definitions/get_first_level_test_suites_for_test_project.rb +14 -0
  11. data/features/step_definitions/get_projects.rb +56 -0
  12. data/features/support/db/one_project.sql +1311 -0
  13. data/features/support/db/some_testsuites.sql +1312 -0
  14. data/features/support/env.rb +32 -0
  15. data/features/support/test_link_test_module.rb +32 -0
  16. data/lib/test_link.rb +22 -0
  17. data/lib/test_link/adapters.rb +24 -0
  18. data/lib/test_link/adapters/base.rb +35 -0
  19. data/lib/test_link/adapters/node_adapter.rb +47 -0
  20. data/lib/test_link/adapters/project_adapter.rb +32 -0
  21. data/lib/test_link/adapters/status_adapter.rb +33 -0
  22. data/lib/test_link/api_link.rb +62 -0
  23. data/lib/test_link/command.rb +29 -0
  24. data/lib/test_link/command/argument.rb +31 -0
  25. data/lib/test_link/command/base.rb +63 -0
  26. data/lib/test_link/command/create_test_case.rb +40 -0
  27. data/lib/test_link/command/create_test_suite.rb +35 -0
  28. data/lib/test_link/command/definition.rb +45 -0
  29. data/lib/test_link/command/get_first_level_test_suites_for_test_project.rb +29 -0
  30. data/lib/test_link/command/get_projects.rb +26 -0
  31. data/lib/test_link/command/get_test_suite_by_id.rb +29 -0
  32. data/lib/test_link/command/get_test_suites_for_test_suite.rb +29 -0
  33. data/lib/test_link/exceptions.rb +23 -0
  34. data/lib/test_link/exceptions/command_failed_exception.rb +26 -0
  35. data/lib/test_link/exceptions/empty_response_exception.rb +26 -0
  36. data/lib/test_link/exceptions/error_response_exception.rb +28 -0
  37. data/lib/test_link/exceptions/exception.rb +21 -0
  38. data/lib/test_link/objects.rb +24 -0
  39. data/lib/test_link/objects/methods.rb +29 -0
  40. data/lib/test_link/objects/node.rb +25 -0
  41. data/lib/test_link/objects/project.rb +25 -0
  42. data/lib/test_link/objects/status.rb +25 -0
  43. data/lib/testlink-api-client.rb +16 -0
  44. data/spec/spec_helper.rb +39 -0
  45. data/spec/test_link/adapters/base_spec.rb +56 -0
  46. data/spec/test_link/adapters/node_adapter_spec.rb +102 -0
  47. data/spec/test_link/adapters/project_adapter_spec.rb +81 -0
  48. data/spec/test_link/adapters/status_adapter_spec.rb +51 -0
  49. data/spec/test_link/api_link_spec.rb +106 -0
  50. data/spec/test_link/command/argument_spec.rb +43 -0
  51. data/spec/test_link/command/base_spec.rb +94 -0
  52. data/spec/test_link/command/create_test_case_spec.rb +88 -0
  53. data/spec/test_link/command/create_test_suite_spec.rb +67 -0
  54. data/spec/test_link/command/get_first_level_test_suites_for_test_project_spec.rb +43 -0
  55. data/spec/test_link/command/get_projets_spec.rb +33 -0
  56. data/spec/test_link/command/get_test_suite_by_id_spec.rb +43 -0
  57. data/spec/test_link/command/get_test_suites_for_test_suite_spec.rb +43 -0
  58. data/spec/test_link/exceptions/command_failed_exception_spec.rb +28 -0
  59. data/spec/test_link/exceptions/empty_response_exception_spec.rb +28 -0
  60. data/spec/test_link/exceptions/error_response_exception_spec.rb +30 -0
  61. data/spec/test_link/objects/node_spec.rb +49 -0
  62. data/spec/test_link/objects/project_spec.rb +39 -0
  63. data/spec/test_link/objects/status_spec.rb +43 -0
  64. metadata +194 -0
@@ -0,0 +1,25 @@
1
+ # This file is part of testlink-api-client.
2
+ #
3
+ # testlink-api-client is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # testlink-api-client is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with Foobar. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require 'test_link/objects/methods'
17
+
18
+ module TestLink
19
+ module Objects
20
+ class Project
21
+ include Methods
22
+ attr_accessor :id, :name, :prefix, :notes
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # This file is part of testlink-api-client.
2
+ #
3
+ # testlink-api-client is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # testlink-api-client is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with Foobar. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require 'test_link/objects/methods'
17
+
18
+ module TestLink
19
+ module Objects
20
+ class Status
21
+ include Methods
22
+ attr_accessor :id, :status, :message, :additional_info, :operation
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ # This file is part of testlink-api-client.
2
+ #
3
+ # testlink-api-client is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # testlink-api-client is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with Foobar. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require 'test_link'
@@ -0,0 +1,39 @@
1
+ # This file is part of testlink-api-client.
2
+ #
3
+ # testlink-api-client is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # testlink-api-client is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with Foobar. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ module RSpec::Matchers
17
+ def attribute_provided? object, attribute
18
+ assignment = (attribute.to_s + '=').to_sym
19
+ (object.respond_to? attribute) && (object.respond_to? assignment)
20
+ end
21
+ end
22
+
23
+ RSpec::Matchers.define :provide do |attribute|
24
+ match do |object|
25
+ attribute_provided? object, attribute
26
+ end
27
+ end
28
+
29
+ RSpec::Matchers.define :provide_mandatory_argument do |argument|
30
+ match do |command|
31
+ (attribute_provided? command, argument) && command.class.arguments[argument].mandatory?
32
+ end
33
+ end
34
+
35
+ RSpec::Matchers.define :provide_argument do |argument|
36
+ match do |command|
37
+ (attribute_provided? command, argument) && (command.class.arguments.has_key? argument)
38
+ end
39
+ end
@@ -0,0 +1,56 @@
1
+ # This file is part of testlink-api-client.
2
+ #
3
+ # testlink-api-client is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # testlink-api-client is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with Foobar. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require "test_link/adapters/base"
17
+ require "test_link/exceptions/error_response_exception"
18
+ require "test_link/exceptions/empty_response_exception"
19
+
20
+ describe TestLink::Adapters::Base do
21
+ before :each do
22
+ @adapter = TestLink::Adapters::Base.new
23
+ end
24
+
25
+ it "manages responses" do
26
+ @adapter.should provide :response
27
+ end
28
+
29
+ it "raises an exception when an error code is detected in the response" do
30
+ @adapter.response = [{"code"=> 2000, "message"=>"Can not authenticate client: invalid developer key"}]
31
+ expect { @adapter.adapt }.to raise_exception TestLink::Exceptions::ErrorResponseException, "Can not authenticate client: invalid developer key"
32
+ end
33
+
34
+ it "raises an exception when response is empty" do
35
+ @adapter.response = []
36
+ expect { @adapter.adapt }.to raise_exception TestLink::Exceptions::EmptyResponseException, "Response is empty"
37
+ end
38
+
39
+ it "raises an exception when response is nil" do
40
+ @adapter.response = nil
41
+ expect { @adapter.adapt }.to raise_exception TestLink::Exceptions::EmptyResponseException, "Response is empty"
42
+ end
43
+
44
+ it 'calls adapt_row' do
45
+ def @adapter.adapt_row row
46
+ end
47
+ @adapter.response = [{'name' => 'a'}, {'name' => 'b'}]
48
+ @adapter.response.each { |row| @adapter.should_receive(:adapt_row).with(row) }
49
+ @adapter.adapt
50
+ end
51
+
52
+ it 'recognises when a command failed' do
53
+ @adapter.response = {"status_ok" => 0, 'id' => 0, 'msg' => msg = 'Rorem ipsum erroor sit amet'}
54
+ expect { @adapter.adapt }.to raise_exception TestLink::Exceptions::CommandFailedException, "Command has failed: #{msg}"
55
+ end
56
+ end
@@ -0,0 +1,102 @@
1
+ # This file is part of testlink-api-client.
2
+ #
3
+ # testlink-api-client is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # testlink-api-client is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with Foobar. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require "test_link/adapters/node_adapter"
17
+ require "test_link/objects/node"
18
+
19
+ describe TestLink::Adapters::NodeAdapter do
20
+ before :each do
21
+ @adapter = TestLink::Adapters::NodeAdapter.new
22
+ end
23
+
24
+ it "inherits from TestLink::Adapters::Base" do
25
+ TestLink::Adapters::NodeAdapter.should < TestLink::Adapters::Base
26
+ end
27
+
28
+ it "should know how to adapt a single row of a response" do
29
+ node = TestLink::Objects::Node.new
30
+ row = { "id" => (node.id = 2).to_s,
31
+ "parent_id" => (node.parent_id = 1).to_s,
32
+ "node_type_id" => (node.type_id = 2).to_s,
33
+ "node_order" => (node.order = 1).to_s,
34
+ "node_table" => node.table = "testsuites",
35
+ "name" => node.name = "First Testsuite"}
36
+
37
+ @adapter.adapt_row(row).should == node
38
+ end
39
+
40
+ it "should should adapt raw response to Project objects" do
41
+ node1 = TestLink::Objects::Node.new
42
+ node2 = TestLink::Objects::Node.new
43
+
44
+ response = [
45
+ { "id" => (node1.id = 2).to_s,
46
+ "parent_id" => (node1.parent_id = 1).to_s,
47
+ "node_type_id" => (node1.type_id = 2).to_s,
48
+ "node_order" => (node1.order = 1).to_s,
49
+ "node_table" => node1.table = "testsuites",
50
+ "name" => node1.name = "First Testsuite"},
51
+ { "id" => (node2.id = 3).to_s,
52
+ "parent_id" => (node2.parent_id = 1).to_s,
53
+ "node_type_id" => (node2.type_id = 2).to_s,
54
+ "node_order" => (node2.order = 2).to_s,
55
+ "node_table" => node2.table = "testsuites",
56
+ "name" => node2.name = "Second Testsuite"}]
57
+
58
+ @adapter.response = response
59
+ @adapter.adapt.should == [ node1, node2 ]
60
+ end
61
+
62
+ describe "workaround unexpected messages form" do
63
+ it 'allows to receive hashes pretending do be arrays' do
64
+ node1 = TestLink::Objects::Node.new
65
+ node2 = TestLink::Objects::Node.new
66
+
67
+ response = {
68
+ "4" => {
69
+ "id" => (node1.id = 4).to_s,
70
+ "details" => node1.details = "<p>First one's child</p>",
71
+ "name" => node1.name = "First Testsuite's child",
72
+ "node_type_id" => (node1.type_id = 2).to_s,
73
+ "node_order"=> (node1.order = 1).to_s,
74
+ "parent_id" => (node1.parent_id = 2).to_s},
75
+ "5" => {
76
+ "id" => (node2.id = 5).to_s,
77
+ "details" => node2.details = "",
78
+ "name" => node2.name = "Frist's Second testsuite",
79
+ "node_type_id" => (node2.type_id = 2).to_s,
80
+ "node_order" => (node2.order = 2).to_s,
81
+ "parent_id"=> (node2.parent_id = 2).to_s}}
82
+
83
+ @adapter.response = response
84
+ @adapter.adapt.should == [ node1, node2 ]
85
+ end
86
+
87
+ it 'allows to receive a single node out of an array' do
88
+ node = TestLink::Objects::Node.new
89
+
90
+ response = {
91
+ "id" => (node.id = 4).to_s,
92
+ "details" => node.details = "<p>First one's child</p>",
93
+ "name" => node.name = "First Testsuite's child",
94
+ "node_type_id" => (node.type_id = 2).to_s,
95
+ "node_order" => (node.order = 1).to_s,
96
+ "parent_id" => (node.parent_id = 2).to_s}
97
+
98
+ @adapter.response = response
99
+ @adapter.adapt.should == [ node ]
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,81 @@
1
+ # This file is part of testlink-api-client.
2
+ #
3
+ # testlink-api-client is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # testlink-api-client is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with Foobar. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require "test_link/adapters/project_adapter"
17
+ require "test_link/objects/project"
18
+
19
+ describe TestLink::Adapters::ProjectAdapter do
20
+ before :each do
21
+ @project_adapter = TestLink::Adapters::ProjectAdapter.new
22
+ end
23
+
24
+ it "inherits from TestLink::Adapters::Base" do
25
+ TestLink::Adapters::ProjectAdapter.should < TestLink::Adapters::Base
26
+ end
27
+
28
+ it "should know how to adapt a single row of a response" do
29
+ p_formation = TestLink::Objects::Project.new
30
+ row = {"id"=> (p_formation.id = 203).to_s ,
31
+ "notes"=> p_formation.notes = "",
32
+ "color"=>"",
33
+ "active"=>"1",
34
+ "prefix"=> p_formation.prefix = "FOR",
35
+ "tc_counter"=>"0",
36
+ "is_public"=>"1",
37
+ "options"=>"O:8:\"stdClass\":4:{s:19:\"requirementsEnabled\";s:1:\"1\";s:19:\"testPriorityEnabled\";s:1:\"1\";s:17:\"automationEnabled\";s:1:\"1\";s:16:\"inventoryEnabled\";b:0;}",
38
+ "name"=> p_formation.name = 'Formation',
39
+ "opt"=>{"requirementsEnabled"=>"1",
40
+ "testPriorityEnabled"=>"1",
41
+ "automationEnabled"=>"1",
42
+ "inventoryEnabled"=>false}}
43
+
44
+ @project_adapter.adapt_row(row).should == p_formation
45
+ end
46
+
47
+ it "should should adapt raw response to Project objects" do
48
+ p_formation = TestLink::Objects::Project.new
49
+ p_val = TestLink::Objects::Project.new
50
+ response = [
51
+ {"id"=> (p_formation.id = 203).to_s ,
52
+ "notes"=> p_formation.notes = "",
53
+ "color"=>"",
54
+ "active"=>"1",
55
+ "prefix"=> p_formation.prefix = "FOR",
56
+ "tc_counter"=>"0",
57
+ "is_public"=>"1",
58
+ "options"=>"O:8:\"stdClass\":4:{s:19:\"requirementsEnabled\";s:1:\"1\";s:19:\"testPriorityEnabled\";s:1:\"1\";s:17:\"automationEnabled\";s:1:\"1\";s:16:\"inventoryEnabled\";b:0;}",
59
+ "name"=> p_formation.name = 'Formation',
60
+ "opt"=>{"requirementsEnabled"=>"1",
61
+ "testPriorityEnabled"=>"1",
62
+ "automationEnabled"=>"1",
63
+ "inventoryEnabled"=>false}},
64
+ {"id"=>(p_val.id = 1),
65
+ "notes"=> p_val.notes = "",
66
+ "color"=>"",
67
+ "active"=>"1",
68
+ "prefix"=> p_val.prefix = "TC185",
69
+ "tc_counter"=>"74",
70
+ "is_public"=>"1",
71
+ "options"=>"O:8:\"stdClass\":4:{s:19:\"requirementsEnabled\";s:1:\"1\";s:19:\"testPriorityEnabled\";s:1:\"1\";s:17:\"automationEnabled\";s:1:\"1\";s:16:\"inventoryEnabled\";b:0;}",
72
+ "name"=> p_val.name = "Validation TestLink",
73
+ "opt"=>{"requirementsEnabled"=>"1",
74
+ "testPriorityEnabled"=>"1",
75
+ "automationEnabled"=>"1",
76
+ "inventoryEnabled"=>false}}]
77
+
78
+ @project_adapter.response = response
79
+ @project_adapter.adapt.should == [ p_formation, p_val ]
80
+ end
81
+ end
@@ -0,0 +1,51 @@
1
+ # This file is part of testlink-api-client.
2
+ #
3
+ # testlink-api-client is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # testlink-api-client is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with Foobar. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require "test_link/adapters/status_adapter"
17
+ require "test_link/objects/status"
18
+
19
+ describe TestLink::Adapters::StatusAdapter do
20
+ before :each do
21
+ @status_adapter = TestLink::Adapters::StatusAdapter.new
22
+ end
23
+
24
+ it "inherits from TestLink::Adapters::Base" do
25
+ TestLink::Adapters::StatusAdapter.should < TestLink::Adapters::Base
26
+ end
27
+
28
+ it "knows how to adapt a single row of a response" do
29
+ status = TestLink::Objects::Status.new
30
+ row = {
31
+ "id"=> (status.id = 2).to_s,
32
+ "status" => status.status = true,
33
+ "operation" => status.operation = "createTestSuite",
34
+ "additionalInfo" => status.additional_info = "some more infos",
35
+ "message" => status.message = "ok"}
36
+ @status_adapter.adapt_row(row).should == status
37
+ end
38
+
39
+ it "should should adapt raw response to Status objects" do
40
+ status = TestLink::Objects::Status.new
41
+ response = [{
42
+ "id"=> (status.id = 2).to_s,
43
+ "status" => status.status = true,
44
+ "operation" => status.operation = "createTestSuite",
45
+ "additionalInfo" => status.additional_info = "some more infos",
46
+ "message" => status.message = "ok"}]
47
+
48
+ @status_adapter.response = response
49
+ @status_adapter.adapt.should == [ status ]
50
+ end
51
+ end
@@ -0,0 +1,106 @@
1
+ # This file is part of testlink-api-client.
2
+ #
3
+ # testlink-api-client is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # testlink-api-client is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with Foobar. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require 'test_link/api_link'
17
+ require 'test_link/command/base'
18
+
19
+ describe TestLink::ApiLink do
20
+ before :each do
21
+ @url = 'http://qa.example.com'
22
+ @key = '__dev_key__'
23
+ @link = TestLink::ApiLink.new @url, @key
24
+ end
25
+
26
+ it 'has a server url' do
27
+ @link.url.should == @url
28
+ end
29
+
30
+ it 'has an API key' do
31
+ @link.key.should == @key
32
+ end
33
+
34
+ it 'has an API url' do
35
+ @link.api_url.should == (@url + '/lib/api/xmlrpc.php')
36
+ end
37
+
38
+ it 'holds a XMLRPC client' do
39
+ @link.client.should be_an_instance_of XMLRPC::Client
40
+ end
41
+
42
+ it 'allows to add remote methods' do
43
+ TestLink::ApiLink.should respond_to :remote_method
44
+ end
45
+
46
+ it 'allows to define an adapter for each remote method' do
47
+ TestLink::ApiLink.should respond_to :set_adapter_for
48
+ end
49
+
50
+ describe 'Adding remote method support' do
51
+ before :all do
52
+ class TestLink::ApiLink
53
+ def self.remote_methods
54
+ @@remote_methods
55
+ end
56
+ end
57
+
58
+ class FooAdapter
59
+ attr_accessor :response
60
+ def adapt
61
+ end
62
+ end
63
+
64
+ class Foo < TestLink::Command::Base
65
+ adapt_with FooAdapter
66
+
67
+ def command_name
68
+ 'foo'
69
+ end
70
+
71
+ def execute link
72
+ [{}]
73
+ end
74
+ end
75
+
76
+ TestLink::ApiLink.remote_method Foo
77
+ end
78
+
79
+ it 'finds out the name of the method with class command_name method' do
80
+ link = TestLink::ApiLink.new('http://qa.example.com/', '')
81
+ link.should respond_to :foo
82
+ end
83
+
84
+ it 'registers a new class instance with the command symbol' do
85
+ TestLink::ApiLink.remote_methods[:foo].should be_an_instance_of Foo
86
+ end
87
+
88
+ describe 'execution' do
89
+ before :each do
90
+ @link = TestLink::ApiLink.new('http://qa.example.com/', '___dev_key___')
91
+ end
92
+
93
+ it 'calls the registered command class execute method with parameters' do
94
+ args = {:foo => 'bar', :baz => 42}
95
+ foo = TestLink::ApiLink.remote_methods[:foo]
96
+ foo.should_receive(:execute).with(@link)
97
+ foo.should_receive(:reset_arguments_hash).with(args)
98
+ @link.foo args
99
+ end
100
+
101
+ it 'uses the command specified adapter' do
102
+ TestLink::ApiLink.adapter_for(Foo.command_name.to_sym).should be_an_instance_of FooAdapter
103
+ end
104
+ end
105
+ end
106
+ end