bcx 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/.travis.yml +6 -0
  2. data/README.md +57 -4
  3. data/docs/bcx.html +171 -0
  4. data/docs/configuration.html +128 -0
  5. data/docs/docco.css +500 -0
  6. data/docs/http.html +125 -0
  7. data/docs/oauth.html +127 -0
  8. data/docs/person.html +125 -0
  9. data/docs/project.html +143 -0
  10. data/docs/public/fonts/aller-bold.eot +0 -0
  11. data/docs/public/fonts/aller-bold.ttf +0 -0
  12. data/docs/public/fonts/aller-bold.woff +0 -0
  13. data/docs/public/fonts/aller-light.eot +0 -0
  14. data/docs/public/fonts/aller-light.ttf +0 -0
  15. data/docs/public/fonts/aller-light.woff +0 -0
  16. data/docs/public/fonts/fleurons.eot +0 -0
  17. data/docs/public/fonts/fleurons.ttf +0 -0
  18. data/docs/public/fonts/fleurons.woff +0 -0
  19. data/docs/public/fonts/novecento-bold.eot +0 -0
  20. data/docs/public/fonts/novecento-bold.ttf +0 -0
  21. data/docs/public/fonts/novecento-bold.woff +0 -0
  22. data/docs/public/images/gray.png +0 -0
  23. data/docs/public/stylesheets/normalize.css +375 -0
  24. data/docs/response_error.html +117 -0
  25. data/docs/todo.html +138 -0
  26. data/docs/todolist.html +148 -0
  27. data/docs/version.html +103 -0
  28. data/lib/bcx/client/http.rb +25 -0
  29. data/lib/bcx/client/oauth.rb +27 -0
  30. data/lib/bcx/resources/person.rb +30 -7
  31. data/lib/bcx/resources/project.rb +7 -10
  32. data/lib/bcx/resources/todolist.rb +11 -4
  33. data/lib/bcx/version.rb +1 -1
  34. data/lib/bcx.rb +12 -1
  35. data/spec/bcx/client_spec.rb +24 -19
  36. data/spec/bcx/person_spec.rb +55 -0
  37. data/spec/bcx/project_spec.rb +1 -1
  38. data/spec/bcx/todo_spec.rb +43 -0
  39. data/spec/bcx/todolist_spec.rb +19 -3
  40. data/spec/cassettes/Bcx_Client/error_handling/should_raise_exception.yml +56 -0
  41. data/spec/cassettes/Bcx_Resources_Person/DELETE_/people/4904728_json/should_delete_a_todolist.yml +101 -0
  42. data/spec/cassettes/Bcx_Resources_Person/GET_/people/4666033_json/should_have_the_correct_id.yml +58 -0
  43. data/spec/cassettes/Bcx_Resources_Person/GET_/people/4666033_json/should_return_a_hash.yml +58 -0
  44. data/spec/cassettes/Bcx_Resources_Person/GET_/people/me_json/should_have_assigned_todos.yml +58 -0
  45. data/spec/cassettes/Bcx_Resources_Person/GET_/people/me_json/should_have_the_correct_id.yml +58 -0
  46. data/spec/cassettes/Bcx_Resources_Person/GET_/people/me_json/should_return_a_hash.yml +58 -0
  47. data/spec/cassettes/Bcx_Resources_Person/GET_/people_json/first_person_should_have_the_correct_id.yml +56 -0
  48. data/spec/cassettes/Bcx_Resources_Person/GET_/people_json/should_be_an_array.yml +56 -0
  49. data/spec/cassettes/Bcx_Resources_Todo/DELETE_/projects/2951531/todos/48545200_json/should_delete_the_given_todo.yml +101 -0
  50. data/spec/cassettes/Bcx_Resources_Todo/GET_/projects/2951531/todos/48545200_json/should_have_the_correct_id.yml +61 -0
  51. data/spec/cassettes/Bcx_Resources_Todo/GET_/projects/2951531/todos/48545200_json/should_return_a_hash.yml +61 -0
  52. data/spec/cassettes/Bcx_Resources_Todo/POST_/projects/2951531/todolists/2951531/todos_json/should_create_a_new_todo.yml +56 -0
  53. data/spec/cassettes/Bcx_Resources_Todo/POST_/projects/2951531/todolists/8268819/todos_json/should_create_a_new_todo.yml +62 -0
  54. data/spec/cassettes/Bcx_Resources_Todo/PUT_/projects/2951531/todos/48545200_json/should_update_an_existing_todo.yml +61 -0
  55. data/spec/cassettes/Bcx_Resources_Todolist/DELETE_/projects/2956584/todolists/8268819_json/should_create_a_new_todolist.yml +66 -0
  56. data/spec/cassettes/Bcx_Resources_Todolist/DELETE_/projects/2956584/todolists/8268819_json/should_delete_a_todolist.yml +101 -0
  57. data/spec/cassettes/Bcx_Resources_Todolist/POST_/projects/123/todolists_json/should_create_a_new_todolist.yml +62 -0
  58. data/spec/cassettes/Bcx_Resources_Todolist/PUT_/projects/2956584/todolists/8268819_json/should_create_a_new_todolist.yml +186 -0
  59. metadata +88 -14
  60. data/lib/bcx/client.rb +0 -24
@@ -0,0 +1,148 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <title>todolist.rb</title>
6
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
7
+ <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
8
+ <link rel="stylesheet" media="all" href="docco.css" />
9
+ </head>
10
+ <body>
11
+ <div id="container">
12
+ <div id="background"></div>
13
+
14
+ <ul id="jump_to">
15
+ <li>
16
+ <a class="large" href="javascript:void(0);">Jump To &hellip;</a>
17
+ <a class="small" href="javascript:void(0);">+</a>
18
+ <div id="jump_wrapper">
19
+ <div id="jump_page">
20
+
21
+
22
+ <a class="source" href="bcx.html">
23
+ bcx.rb
24
+ </a>
25
+
26
+
27
+ <a class="source" href="http.html">
28
+ http.rb
29
+ </a>
30
+
31
+
32
+ <a class="source" href="oauth.html">
33
+ oauth.rb
34
+ </a>
35
+
36
+
37
+ <a class="source" href="configuration.html">
38
+ configuration.rb
39
+ </a>
40
+
41
+
42
+ <a class="source" href="person.html">
43
+ person.rb
44
+ </a>
45
+
46
+
47
+ <a class="source" href="project.html">
48
+ project.rb
49
+ </a>
50
+
51
+
52
+ <a class="source" href="todo.html">
53
+ todo.rb
54
+ </a>
55
+
56
+
57
+ <a class="source" href="todolist.html">
58
+ todolist.rb
59
+ </a>
60
+
61
+
62
+ <a class="source" href="response_error.html">
63
+ response_error.rb
64
+ </a>
65
+
66
+
67
+ <a class="source" href="version.html">
68
+ version.rb
69
+ </a>
70
+
71
+ </div>
72
+ </li>
73
+ </ul>
74
+
75
+ <ul class="sections">
76
+
77
+ <li id="title">
78
+ <div class="annotation">
79
+ <h1>todolist.rb</h1>
80
+ </div>
81
+ </li>
82
+
83
+
84
+
85
+ <li id="section-1">
86
+ <div class="annotation">
87
+
88
+ <div class="pilwrap ">
89
+ <a class="pilcrow" href="#section-1">&#182;</a>
90
+ </div>
91
+
92
+ </div>
93
+
94
+ <div class="content"><div class='highlight'><pre><span class="class"><span class="keyword">module</span> <span class="title">Bcx</span></span>
95
+ <span class="class"><span class="keyword">module</span> <span class="title">Resources</span></span></pre></div></div>
96
+
97
+ </li>
98
+
99
+
100
+ <li id="section-2">
101
+ <div class="annotation">
102
+
103
+ <div class="pilwrap ">
104
+ <a class="pilcrow" href="#section-2">&#182;</a>
105
+ </div>
106
+ <p>Bcx::Resources::Todolist
107
+ Provides access to todolist resoource both at the client level and per-project</p>
108
+ <p>Get all todolists for a project
109
+ GET /projects/123/todolists.json</p>
110
+ <p> client.projects(123).todolists!</p>
111
+ <p>Get all completed todolists for a project
112
+ GET /projects/1/todolists/completed.json</p>
113
+ <p> client.projects(123).todolists.completed!</p>
114
+ <p>Get todolists for all projects
115
+ GET /todolists.json</p>
116
+ <p> client.todolists!</p>
117
+ <p>Get completed todolists for all projects
118
+ GET /todolists/completed.json</p>
119
+ <p> client.todolists.completed!</p>
120
+ <p>Get specific todolist including the todos
121
+ GET /projects/123/todolists/456.json</p>
122
+ <p> client.projects(123).todolists!(456)</p>
123
+ <p>Create a new todolist
124
+ POST /projects/1/todolists.json</p>
125
+ <p> client.projects(123).todolists.create!(name: &#39;My todolist&#39;, description: &#39;This is a todolist&#39;)</p>
126
+ <p>Update an existing todolist
127
+ PUT /projects/123/todolists/456.json</p>
128
+ <p> client.projects(123).todolists(456).update!(name: &#39;Updated todolist&#39;)</p>
129
+ <p>Delete a todolist
130
+ DELETE /projects/123/todolists/456.json</p>
131
+ <p> client.projects(123).todolists(456).delete!</p>
132
+
133
+ </div>
134
+
135
+ <div class="content"><div class='highlight'><pre> <span class="class"><span class="keyword">class</span> <span class="title">Todolist</span> <span class="inheritance">&lt; <span class="parent">Rapidash::Base</span></span></span>
136
+ resource <span class="symbol">:todos</span>, <span class="symbol">class_name:</span> <span class="string">'Bcx::Resources::Todo'</span>
137
+
138
+ collection <span class="symbol">:completed</span>
139
+ <span class="keyword">end</span>
140
+ <span class="keyword">end</span>
141
+ <span class="keyword">end</span></pre></div></div>
142
+
143
+ </li>
144
+
145
+ </ul>
146
+ </div>
147
+ </body>
148
+ </html>
data/docs/version.html ADDED
@@ -0,0 +1,103 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <title>version.rb</title>
6
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
7
+ <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
8
+ <link rel="stylesheet" media="all" href="docco.css" />
9
+ </head>
10
+ <body>
11
+ <div id="container">
12
+ <div id="background"></div>
13
+
14
+ <ul id="jump_to">
15
+ <li>
16
+ <a class="large" href="javascript:void(0);">Jump To &hellip;</a>
17
+ <a class="small" href="javascript:void(0);">+</a>
18
+ <div id="jump_wrapper">
19
+ <div id="jump_page">
20
+
21
+
22
+ <a class="source" href="bcx.html">
23
+ bcx.rb
24
+ </a>
25
+
26
+
27
+ <a class="source" href="http.html">
28
+ http.rb
29
+ </a>
30
+
31
+
32
+ <a class="source" href="oauth.html">
33
+ oauth.rb
34
+ </a>
35
+
36
+
37
+ <a class="source" href="configuration.html">
38
+ configuration.rb
39
+ </a>
40
+
41
+
42
+ <a class="source" href="person.html">
43
+ person.rb
44
+ </a>
45
+
46
+
47
+ <a class="source" href="project.html">
48
+ project.rb
49
+ </a>
50
+
51
+
52
+ <a class="source" href="todo.html">
53
+ todo.rb
54
+ </a>
55
+
56
+
57
+ <a class="source" href="todolist.html">
58
+ todolist.rb
59
+ </a>
60
+
61
+
62
+ <a class="source" href="response_error.html">
63
+ response_error.rb
64
+ </a>
65
+
66
+
67
+ <a class="source" href="version.html">
68
+ version.rb
69
+ </a>
70
+
71
+ </div>
72
+ </li>
73
+ </ul>
74
+
75
+ <ul class="sections">
76
+
77
+ <li id="title">
78
+ <div class="annotation">
79
+ <h1>version.rb</h1>
80
+ </div>
81
+ </li>
82
+
83
+
84
+
85
+ <li id="section-1">
86
+ <div class="annotation">
87
+
88
+ <div class="pilwrap ">
89
+ <a class="pilcrow" href="#section-1">&#182;</a>
90
+ </div>
91
+
92
+ </div>
93
+
94
+ <div class="content"><div class='highlight'><pre><span class="class"><span class="keyword">module</span> <span class="title">Bcx</span></span>
95
+ <span class="constant">VERSION</span> = <span class="string">"0.0.2"</span>
96
+ <span class="keyword">end</span></pre></div></div>
97
+
98
+ </li>
99
+
100
+ </ul>
101
+ </div>
102
+ </body>
103
+ </html>
@@ -0,0 +1,25 @@
1
+ module Bcx
2
+ module Client
3
+ class HTTP < Rapidash::Client
4
+ method :http
5
+
6
+ extension :json
7
+ encode_post_data_with :json
8
+
9
+ raise_errors
10
+
11
+ resource :projects, class_name: 'Bcx::Resources::Project'
12
+ resource :todolists, class_name: 'Bcx::Resources::Todolist'
13
+ resource :people, class_name: 'Bcx::Resources::Person'
14
+
15
+ def initialize(options = {})
16
+ @account = Bcx.configuration.account
17
+ @api_version = Bcx.configuration.api_version
18
+
19
+ self.class.site("https://basecamp.com/#{@account}/api/#{@api_version}/")
20
+
21
+ super(options)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module Bcx
2
+ module Client
3
+ class OAuth < Rapidash::Client
4
+ method :oauth
5
+
6
+ extension :json
7
+ encode_post_data_with :json
8
+
9
+ raise_errors
10
+
11
+ resource :projects, class_name: 'Bcx::Resources::Project'
12
+ resource :todolists, class_name: 'Bcx::Resources::Todolist'
13
+ resource :people, class_name: 'Bcx::Resources::Person'
14
+
15
+ def initialize(options = {})
16
+ @account = Bcx.configuration.account
17
+ @api_version = Bcx.configuration.api_version
18
+
19
+ options[:site] = "https://basecamp.com/#{@account}/api/#{@api_version}"
20
+ options[:uid] ||= options[:client_id]
21
+ options[:secret] ||= options[:client_secret]
22
+
23
+ super(options)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,13 +1,36 @@
1
+ # `Bcx::Resources::Person`
2
+ # Provides access to people resource
3
+ #
4
+ # #### Get all people on the account
5
+ # `GET /people.json`
6
+ #
7
+ # client.people!
8
+ #
9
+ # #### Get a person
10
+ # `GET /people/123.json`
11
+ #
12
+ # client.people!(123)
13
+ #
14
+ # #### Get the current person
15
+ # `GET /people/me.json`
16
+ #
17
+ # client.people.me!
18
+ #
19
+ # #### Get assigned todos for a person
20
+ # `GET /people/1/assigned_todos.json`
21
+ #
22
+ # client.people(1).assigned_todos
23
+ #
24
+ # #### Delete a person
25
+ # `DELETE /people/123.json`
26
+ #
27
+ # client.people(123).delete!
28
+ #
1
29
  module Bcx
2
30
  module Resources
3
-
4
- # Get todolists with assigned todos for a person
5
- # GET /people/1/assigned_todos.json
6
- #
7
- # client.people(1).assigned_todos
8
- #
9
31
  class Person < Rapidash::Base
10
-
32
+ url :people
33
+ collection :me
11
34
  end
12
35
  end
13
36
  end
@@ -7,41 +7,38 @@ module Bcx
7
7
  # Fetch all projects
8
8
  # GET /projects.json
9
9
  #
10
- # client.projects!
10
+ # client.projects!
11
11
  #
12
12
  # Fetch archived projects
13
13
  # GET /projects/archived.json
14
14
  #
15
- # clients.projects.archived!
15
+ # clients.projects.archived!
16
16
  #
17
17
  # Fetch single project with ID of 123
18
18
  # GET /projects/123.json
19
19
  #
20
- # client.projects!(123)
20
+ # client.projects!(123)
21
21
  #
22
22
  # Create a project
23
23
  # POST /projects.json
24
24
  #
25
- # client.projects.create!(name: 'Acme project', description: 'This is a new project')
25
+ # client.projects.create!(name: 'Acme project', description: 'This is a new project')
26
26
  #
27
27
  # Update an existing project
28
28
  # PUT /projects/123.json
29
29
  #
30
- # client.projects(123).update!(description: 'A new description')
30
+ # client.projects(123).update!(description: 'A new description')
31
31
  #
32
32
  # Delete a project
33
33
  # DELETE /projects/123.json
34
34
  #
35
- # client.projects(123).delete!
35
+ # client.projects(123).delete!
36
36
  #
37
37
  class Project < Rapidash::Base
38
38
  resource :todolists
39
39
  resource :todos
40
40
 
41
- def archived!
42
- @url += '/archived'
43
- call!
44
- end
41
+ collection :archived
45
42
  end
46
43
  end
47
44
  end
@@ -34,13 +34,20 @@ module Bcx
34
34
  #
35
35
  # client.projects(123).todolists.create!(name: 'My todolist', description: 'This is a todolist')
36
36
  #
37
+ # Update an existing todolist
38
+ # PUT /projects/123/todolists/456.json
39
+ #
40
+ # client.projects(123).todolists(456).update!(name: 'Updated todolist')
41
+ #
42
+ # Delete a todolist
43
+ # DELETE /projects/123/todolists/456.json
44
+ #
45
+ # client.projects(123).todolists(456).delete!
46
+ #
37
47
  class Todolist < Rapidash::Base
38
48
  resource :todos, class_name: 'Bcx::Resources::Todo'
39
49
 
40
- def completed!
41
- @url += '/completed'
42
- call!
43
- end
50
+ collection :completed
44
51
  end
45
52
  end
46
53
  end
data/lib/bcx/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Bcx
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/bcx.rb CHANGED
@@ -1,6 +1,11 @@
1
1
  require 'rapidash'
2
2
  require 'bcx/version'
3
3
 
4
+ # # Bcx
5
+ # Fully-fledged Ruby API wrapper for Basecamp Next
6
+ #
7
+ # See the [README](https://github.com/paulspringett/bcx#readme) for usage
8
+ #
4
9
  module Bcx
5
10
  autoload :Configuration, 'bcx/configuration'
6
11
 
@@ -8,19 +13,25 @@ module Bcx
8
13
  autoload :Todo, 'bcx/resources/todo'
9
14
  autoload :Todolist, 'bcx/resources/todolist'
10
15
  autoload :Project, 'bcx/resources/project'
16
+ autoload :Person, 'bcx/resources/person'
11
17
  end
12
18
 
13
- autoload :Client, 'bcx/client'
19
+ module Client
20
+ autoload :HTTP, 'bcx/client/http'
21
+ autoload :OAuth, 'bcx/client/oauth'
22
+ end
14
23
 
15
24
  class << self
16
25
  attr_accessor :configuration
17
26
  end
18
27
 
28
+ # Expose configuration block
19
29
  def self.configure
20
30
  self.configuration ||= Configuration.new
21
31
  yield(configuration)
22
32
  end
23
33
  end
24
34
 
35
+ # Use custom `Bcx::ResponseError` on top of Rapidash's error handling
25
36
  require 'bcx/response_error'
26
37
  Rapidash.response_exception_class = Bcx::ResponseError
@@ -2,9 +2,9 @@ require 'spec_helper'
2
2
 
3
3
  describe Bcx::Client do
4
4
 
5
- let(:client) { Bcx::Client.new(:http, login: 'bcx-test-user', password: 'secret') }
5
+ context "http auth" do
6
+ let(:client) { Bcx::Client::HTTP.new(login: 'bcx-test-user', password: 'secret') }
6
7
 
7
- describe "http auth" do
8
8
  it "should assign login" do
9
9
  expect(client.login).to eq 'bcx-test-user'
10
10
  end
@@ -18,23 +18,28 @@ describe Bcx::Client do
18
18
  end
19
19
  end
20
20
 
21
- # TODO: test handling to reponse errors, with error codes
22
- # it "should fail for invalid attributes" do
23
- # expect { client.projects.create!(name: '') }.to raise_error { |error|
24
- # expect(error).to be_a Bcx::ResponseError
25
- # expect(error.status).to eq 422
26
- # }
27
- # end
28
-
29
- # Rescue a response error example
30
- # begin
31
- # project = client.projects.create!(name: 'foo')
32
- # rescue Bcx::ResponseError => response
33
- # puts response.status
34
- # => 422
35
- # puts response.body
36
- # => "Name cannot be blank"
37
- # end
21
+ context "oauth" do
22
+ let(:client) { Bcx::Client::OAuth.new(client_id: '748cc9c949af86f2e3fb35564f7e209b1d2c27d2', client_secret: '7fba79ec3bf1eb9e278098031414e5a3a41ec842', access_token: 'BAhbByIBsHsiZXhwaXJlc19hdCI6IjIwMTMtMDctMDFUMjE6MTI6MDFaIiwidXNlcl9pZHMiOlsxNzE3NDMwNV0sImNsaWVudF9pZCI6Ijc0OGNjOWM5NDlhZjg2ZjJlM2ZiMzU1NjRmN2UyMDliMWQyYzI3ZDIiLCJ2ZXJzaW9uIjoxLCJhcGlfZGVhZGJvbHQiOiJmZmE1OTgzMzQ3YTY2MWExM2Y1YWE3YTM0ODVhYzk4YiJ9dToJVGltZQ01WBzApGcWMA==--20fd0c6159b19ee6689e149590b14be5fd98bb3b') }
38
23
 
24
+ it "should assign credentials" do
25
+ expect(client.uid).to eq '748cc9c949af86f2e3fb35564f7e209b1d2c27d2'
26
+ expect(client.secret).to eq '7fba79ec3bf1eb9e278098031414e5a3a41ec842'
27
+ end
28
+
29
+ it "should provide an access token" do
30
+ expect(client.access_token).not_to be_nil
31
+ end
32
+ end
39
33
 
34
+ describe "error handling", :vcr do
35
+ let(:client) { Bcx::Client::HTTP.new(login: 'bcx-test-user', password: 'secret') }
36
+
37
+ it "should raise exception" do
38
+ expect { client.projects.create!(name: '') }.to raise_error { |response|
39
+ expect(response).to be_a Bcx::ResponseError
40
+ expect(response.status).to eq 422
41
+ expect(response.errors).to include("name can't be blank")
42
+ }
43
+ end
44
+ end
40
45
  end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bcx::Resources::Person, :vcr do
4
+ let(:client) { Bcx::Client::HTTP.new(login: 'bcx-test-user', password: 'secret') }
5
+
6
+ describe "GET /people.json" do
7
+ let(:people) { client.people! }
8
+
9
+ it "should be an array" do
10
+ expect(people).to be_an Array
11
+ end
12
+
13
+ it "first person should have the correct id" do
14
+ expect(people.first.id).to eq 4666033
15
+ end
16
+ end
17
+
18
+ describe "GET /people/4666033.json" do
19
+ let(:person) { client.people!(4666033) }
20
+
21
+ it "should return a hash" do
22
+ expect(person).to be_a Hashie::Mash
23
+ end
24
+
25
+ it "should have the correct id" do
26
+ expect(person.id).to eq 4666033
27
+ end
28
+ end
29
+
30
+ describe "GET /people/me.json" do
31
+ let(:person) { client.people.me! }
32
+
33
+ it "should return a hash" do
34
+ expect(person).to be_a Hashie::Mash
35
+ end
36
+
37
+ it "should have the correct id" do
38
+ expect(person.id).to eq 4666033
39
+ end
40
+
41
+ it "should have assigned todos" do
42
+ expect(person.assigned_todos).to be_a Hashie::Mash
43
+ end
44
+ end
45
+
46
+ describe "DELETE /people/4904728.json" do
47
+ it "should delete a todolist" do
48
+ client.people(4904728).delete!
49
+ expect { client.people!(4904728) }.to raise_error { |error|
50
+ expect(error).to be_a Bcx::ResponseError
51
+ expect(error.status).to eq 404
52
+ }
53
+ end
54
+ end
55
+ end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Bcx::Resources::Project, :vcr do
4
- let(:client) { Bcx::Client.new(:http, login: 'bcx-test-user', password: 'secret') }
4
+ let(:client) { Bcx::Client::HTTP.new(login: 'bcx-test-user', password: 'secret') }
5
5
 
6
6
  describe "GET /projects" do
7
7
  let(:projects) { client.projects! }
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bcx::Resources::Todo, :vcr do
4
+ let(:client) { Bcx::Client::HTTP.new(login: 'bcx-test-user', password: 'secret') }
5
+
6
+ describe "POST /projects/2951531/todolists/8268819/todos.json" do
7
+ it "should create a new todo" do
8
+ todo = client.projects(2951531).todolists(8268819).todos.create!(content: 'My todo')
9
+ expect(todo.created_at).not_to be_blank
10
+ expect(todo.content).to eq 'My todo'
11
+ end
12
+ end
13
+
14
+ describe "GET /projects/2951531/todos/48545200.json" do
15
+ let(:todo) { client.projects(2951531).todos!(48545200) }
16
+
17
+ it "should return a hash" do
18
+ expect(todo).to be_a Hashie::Mash
19
+ end
20
+
21
+ it "should have the correct id" do
22
+ expect(todo.id).to eq 48545200
23
+ expect(todo.content).to eq 'First todo'
24
+ end
25
+ end
26
+
27
+ describe "PUT /projects/2951531/todos/48545200.json" do
28
+ it "should update an existing todo" do
29
+ todo = client.projects(2951531).todos(48545200).update!(content: 'My updated todo')
30
+ expect(todo.content).to eq 'My updated todo'
31
+ end
32
+ end
33
+
34
+ describe "DELETE /projects/2951531/todos/48545200.json" do
35
+ it "should delete the given todo" do
36
+ client.projects(2951531).todos(48545200).delete!
37
+ expect { client.projects(2951531).todos!(48545200) }.to raise_error { |error|
38
+ expect(error).to be_a Bcx::ResponseError
39
+ expect(error.status).to eq 404
40
+ }
41
+ end
42
+ end
43
+ end
@@ -1,8 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Bcx::Resources::Todolist, :vcr do
4
- let(:client) { Bcx::Client.new(:http, login: 'bcx-test-user', password: 'secret') }
5
-
4
+ let(:client) { Bcx::Client::HTTP.new(login: 'bcx-test-user', password: 'secret') }
6
5
 
7
6
  describe "GET /projects/2937644/todolists.json" do
8
7
  let(:todolists) { client.projects(2956584).todolists! }
@@ -66,10 +65,27 @@ describe Bcx::Resources::Todolist, :vcr do
66
65
  end
67
66
  end
68
67
 
69
- describe "/projects/123/todolists.json" do
68
+ describe "POST /projects/123/todolists.json" do
70
69
  it "should create a new todolist" do
71
70
  todolist = client.projects(2956584).todolists.create!(name: 'My todolist', description: 'This is a todolist')
72
71
  expect(todolist.created_at).not_to be_blank
73
72
  end
74
73
  end
74
+
75
+ describe "PUT /projects/2956584/todolists/8268819.json" do
76
+ it "should create a new todolist" do
77
+ todolist = client.projects(2951531).todolists(8268819).update!(name: 'Renamed todolist')
78
+ expect(todolist.name).to eq 'Renamed todolist'
79
+ end
80
+ end
81
+
82
+ describe "DELETE /projects/2956584/todolists/8268819.json" do
83
+ it "should delete a todolist" do
84
+ client.projects(2951531).todolists(8268819).delete!
85
+ expect { client.projects(2951531).todolists!(8268819) }.to raise_error { |error|
86
+ expect(error).to be_a Bcx::ResponseError
87
+ expect(error.status).to eq 404
88
+ }
89
+ end
90
+ end
75
91
  end