noko 1.5.0 → 1.6.0
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.
- checksums.yaml +4 -4
- data/CHANGES.md +47 -0
- data/LICENSE.txt +1 -1
- data/README.md +9 -18
- data/lib/noko/client.rb +6 -24
- data/lib/noko/client/account.rb +2 -0
- data/lib/noko/client/current_user.rb +2 -0
- data/lib/noko/client/entries.rb +2 -0
- data/lib/noko/client/expenses.rb +2 -0
- data/lib/noko/client/invoices.rb +2 -0
- data/lib/noko/client/project_groups.rb +2 -0
- data/lib/noko/client/projects.rb +2 -0
- data/lib/noko/client/tags.rb +2 -0
- data/lib/noko/client/timers.rb +2 -0
- data/lib/noko/client/users.rb +2 -0
- data/lib/noko/errors.rb +8 -2
- data/lib/noko/link_header.rb +3 -1
- data/lib/noko/params.rb +4 -1
- data/lib/noko/response.rb +52 -0
- data/lib/noko/version.rb +1 -1
- data/noko.gemspec +10 -7
- metadata +13 -64
- data/test/noko/client/account_test.rb +0 -9
- data/test/noko/client/current_user_test.rb +0 -39
- data/test/noko/client/entries_test.rb +0 -91
- data/test/noko/client/errors_test.rb +0 -27
- data/test/noko/client/expenses_test.rb +0 -45
- data/test/noko/client/invoices_test.rb +0 -75
- data/test/noko/client/options_test.rb +0 -27
- data/test/noko/client/project_groups_test.rb +0 -63
- data/test/noko/client/projects_test.rb +0 -99
- data/test/noko/client/response_test.rb +0 -39
- data/test/noko/client/tags_test.rb +0 -63
- data/test/noko/client/timers_test.rb +0 -57
- data/test/noko/client/users_test.rb +0 -75
- data/test/noko/client_test.rb +0 -59
- data/test/noko/record_test.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ff0fcc7691e060653275c30cdfb02fd4e19da5ee2f4e1468c6935f26d0c3454
|
4
|
+
data.tar.gz: 622da78be984693f095e5f931c32a52606d1a1cd8f440e53025251c20ebe3f4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63232176cc36783f3891245dcc44a0ee800312038ae904216cc7f219533d2ce4df9382acc80b5b2f1b8bfc722aa29f924e8efda411e8281c912ca78f32cebbcf
|
7
|
+
data.tar.gz: bcb26ccd331dbc71c88193aba038c5f1c06272c0c93590d11486229bf77fdfb795010aa05d18d93b3bd8cdceff51b922bc4b52ad69cd5f6cf8c7c7a9e83d0701
|
data/CHANGES.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# 1.6.0
|
2
|
+
|
3
|
+
* Added Noko::NotFound for 404 responses
|
4
|
+
|
5
|
+
* Added Noko::ClientError for 4xx responses
|
6
|
+
|
7
|
+
* Added Noko::ServerError for 5xx responses
|
8
|
+
|
9
|
+
# 1.5.0
|
10
|
+
|
11
|
+
* Added methods for marking entries invoiced (thanks @lcx)
|
12
|
+
|
13
|
+
* Added methods for marking entries approved
|
14
|
+
|
15
|
+
* Added methods for marking entries unapproved
|
16
|
+
|
17
|
+
# 1.4.0
|
18
|
+
|
19
|
+
* **(breaking change)** Renamed gem from freckles to noko. Steps to upgrade:
|
20
|
+
|
21
|
+
- rename the gem in your Gemfile from `gem 'freckles'` to `gem 'noko'`
|
22
|
+
- rename any requires from `require 'freckle'` to `require 'noko'`
|
23
|
+
- rename any module references from `Freckle` to `Noko`
|
24
|
+
|
25
|
+
# 1.3.0
|
26
|
+
|
27
|
+
* Updated to use nokotime.com hostnames (thanks @madrobby)
|
28
|
+
|
29
|
+
* Updated to use X-NokoToken header
|
30
|
+
|
31
|
+
# 1.2.0
|
32
|
+
|
33
|
+
* Added methods for project group resources
|
34
|
+
|
35
|
+
* Changed default user agent header to include version numbers
|
36
|
+
|
37
|
+
* Removed deprecated #next_page attribute
|
38
|
+
|
39
|
+
# 1.1.0
|
40
|
+
|
41
|
+
* Added methods for returning Link header pagination urls
|
42
|
+
|
43
|
+
* Deprecated #next_page attribute
|
44
|
+
|
45
|
+
# 1.0.0
|
46
|
+
|
47
|
+
* First version!
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,38 +1,29 @@
|
|
1
1
|
# noko
|
2
2
|
|
3
|
-
[](https://badge.fury.io/rb/noko)
|
3
|
+
[](https://badge.fury.io/rb/noko)
|
4
|
+

|
4
5
|
|
5
6
|
|
6
|
-
Ruby client for
|
7
|
+
Ruby client for the [Noko API](https://developer.nokotime.com/v2/).
|
7
8
|
|
8
9
|
|
9
10
|
## Install
|
10
11
|
|
11
|
-
|
12
|
+
Using Bundler:
|
12
13
|
|
13
|
-
|
14
|
-
$ gem install noko
|
15
|
-
```
|
16
|
-
|
17
|
-
Add it to your Gemfile and install using Bundler:
|
18
|
-
|
19
|
-
```ruby
|
20
|
-
gem 'noko'
|
21
|
-
```
|
14
|
+
$ bundle add noko
|
22
15
|
|
23
|
-
|
16
|
+
Using RubyGems:
|
24
17
|
|
25
|
-
|
26
|
-
git clone git@github.com:timcraft/noko.git
|
27
|
-
```
|
18
|
+
$ gem install noko
|
28
19
|
|
29
20
|
|
30
|
-
##
|
21
|
+
## Getting started
|
31
22
|
|
32
23
|
```ruby
|
33
24
|
require 'noko'
|
34
25
|
|
35
|
-
noko = Noko::Client.new(token: '
|
26
|
+
noko = Noko::Client.new(token: ENV.fetch('NOKO_TOKEN'))
|
36
27
|
|
37
28
|
noko.get_projects.each do |project|
|
38
29
|
puts project.name
|
data/lib/noko/client.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'noko/version'
|
2
3
|
require 'noko/errors'
|
3
4
|
require 'noko/link_header'
|
4
5
|
require 'noko/params'
|
5
6
|
require 'noko/record'
|
7
|
+
require 'noko/response'
|
6
8
|
require 'net/http'
|
7
9
|
require 'json'
|
8
10
|
|
@@ -51,32 +53,12 @@ module Noko
|
|
51
53
|
http_request.body = JSON.generate(body_object)
|
52
54
|
end
|
53
55
|
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
def parse(http_response)
|
58
|
-
case http_response
|
59
|
-
when Net::HTTPNoContent
|
60
|
-
:no_content
|
61
|
-
when Net::HTTPSuccess
|
62
|
-
if http_response['Content-Type'] && http_response['Content-Type'].split(';').first == 'application/json'
|
63
|
-
JSON.parse(http_response.body, symbolize_names: true, object_class: Record).tap do |object|
|
64
|
-
if http_response['Link']
|
65
|
-
object.singleton_class.module_eval { attr_accessor :link }
|
66
|
-
object.link = LinkHeader.parse(http_response['Link'])
|
67
|
-
end
|
68
|
-
end
|
69
|
-
else
|
70
|
-
http_response.body
|
71
|
-
end
|
72
|
-
when Net::HTTPBadRequest
|
73
|
-
object = JSON.parse(http_response.body, symbolize_names: true)
|
56
|
+
response = @http.request(http_request)
|
74
57
|
|
75
|
-
|
76
|
-
|
77
|
-
raise AuthenticationError
|
58
|
+
if response.is_a?(Net::HTTPSuccess)
|
59
|
+
Response.parse(response)
|
78
60
|
else
|
79
|
-
raise
|
61
|
+
raise Response.error(response)
|
80
62
|
end
|
81
63
|
end
|
82
64
|
end
|
data/lib/noko/client/account.rb
CHANGED
data/lib/noko/client/entries.rb
CHANGED
data/lib/noko/client/expenses.rb
CHANGED
data/lib/noko/client/invoices.rb
CHANGED
data/lib/noko/client/projects.rb
CHANGED
data/lib/noko/client/tags.rb
CHANGED
data/lib/noko/client/timers.rb
CHANGED
data/lib/noko/client/users.rb
CHANGED
data/lib/noko/errors.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
module Noko
|
2
|
-
|
2
|
+
Error = Class.new(StandardError)
|
3
3
|
|
4
|
-
|
4
|
+
ClientError = Class.new(Error)
|
5
|
+
|
6
|
+
ServerError = Class.new(Error)
|
7
|
+
|
8
|
+
AuthenticationError = Class.new(ClientError)
|
9
|
+
|
10
|
+
NotFound = Class.new(ClientError)
|
5
11
|
end
|
data/lib/noko/link_header.rb
CHANGED
data/lib/noko/params.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'cgi'
|
2
3
|
|
3
4
|
module Noko
|
4
|
-
module Params
|
5
|
+
module Params
|
5
6
|
extend self
|
6
7
|
|
7
8
|
def join(path, params = nil)
|
@@ -24,4 +25,6 @@ module Noko
|
|
24
25
|
CGI.escape(component.to_s)
|
25
26
|
end
|
26
27
|
end
|
28
|
+
|
29
|
+
private_constant :Params
|
27
30
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'net/http'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Noko
|
6
|
+
module Response
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def parse(response)
|
10
|
+
if response.is_a?(Net::HTTPNoContent)
|
11
|
+
return :no_content
|
12
|
+
end
|
13
|
+
|
14
|
+
if response.content_type == 'application/json'
|
15
|
+
object = JSON.parse(response.body, symbolize_names: true, object_class: Record)
|
16
|
+
|
17
|
+
if response['Link']
|
18
|
+
object.singleton_class.module_eval { attr_accessor :link }
|
19
|
+
object.link = LinkHeader.parse(response['Link'])
|
20
|
+
end
|
21
|
+
|
22
|
+
return object
|
23
|
+
end
|
24
|
+
|
25
|
+
response.body
|
26
|
+
end
|
27
|
+
|
28
|
+
def error(response)
|
29
|
+
if response.content_type == 'application/json'
|
30
|
+
body = JSON.parse(response.body)
|
31
|
+
|
32
|
+
error_class(response).new(body['message'])
|
33
|
+
else
|
34
|
+
error_class(response)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def error_class(object)
|
39
|
+
case object
|
40
|
+
when Net::HTTPBadRequest then Noko::ClientError
|
41
|
+
when Net::HTTPUnauthorized then Noko::AuthenticationError
|
42
|
+
when Net::HTTPNotFound then Noko::NotFound
|
43
|
+
when Net::HTTPClientError then Noko::ClientError
|
44
|
+
when Net::HTTPServerError then Noko::ServerError
|
45
|
+
else
|
46
|
+
Noko::Error
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
private_constant :Response
|
52
|
+
end
|
data/lib/noko/version.rb
CHANGED
data/noko.gemspec
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'noko'
|
3
|
-
s.version = '1.
|
3
|
+
s.version = '1.6.0'
|
4
4
|
s.license = 'MIT'
|
5
5
|
s.platform = Gem::Platform::RUBY
|
6
6
|
s.authors = ['Tim Craft']
|
7
7
|
s.email = ['mail@timcraft.com']
|
8
8
|
s.homepage = 'https://github.com/timcraft/noko'
|
9
|
-
s.description = 'Ruby client for
|
10
|
-
s.summary = '
|
11
|
-
s.files = Dir.glob('
|
9
|
+
s.description = 'Ruby client for the Noko API'
|
10
|
+
s.summary = 'See description'
|
11
|
+
s.files = Dir.glob('lib/**/*.rb') + %w(CHANGES.md LICENSE.txt README.md noko.gemspec)
|
12
12
|
s.required_ruby_version = '>= 1.9.3'
|
13
|
-
s.add_development_dependency('rake', '~> 12')
|
14
|
-
s.add_development_dependency('webmock', '~> 3.0')
|
15
|
-
s.add_development_dependency('minitest', '~> 5.0')
|
16
13
|
s.require_path = 'lib'
|
14
|
+
s.metadata = {
|
15
|
+
'homepage' => 'https://github.com/timcraft/noko',
|
16
|
+
'source_code_uri' => 'https://github.com/timcraft/noko',
|
17
|
+
'bug_tracker_uri' => 'https://github.com/timcraft/noko/issues',
|
18
|
+
'changelog_uri' => 'https://github.com/timcraft/noko/blob/master/CHANGES.md'
|
19
|
+
}
|
17
20
|
end
|
metadata
CHANGED
@@ -1,64 +1,23 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: noko
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Craft
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '12'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '12'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: webmock
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '3.0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '3.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: minitest
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '5.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '5.0'
|
55
|
-
description: Ruby client for Version 2 of the Noko/Freckle API
|
11
|
+
date: 2020-05-08 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Ruby client for the Noko API
|
56
14
|
email:
|
57
15
|
- mail@timcraft.com
|
58
16
|
executables: []
|
59
17
|
extensions: []
|
60
18
|
extra_rdoc_files: []
|
61
19
|
files:
|
20
|
+
- CHANGES.md
|
62
21
|
- LICENSE.txt
|
63
22
|
- README.md
|
64
23
|
- lib/noko.rb
|
@@ -77,27 +36,17 @@ files:
|
|
77
36
|
- lib/noko/link_header.rb
|
78
37
|
- lib/noko/params.rb
|
79
38
|
- lib/noko/record.rb
|
39
|
+
- lib/noko/response.rb
|
80
40
|
- lib/noko/version.rb
|
81
41
|
- noko.gemspec
|
82
|
-
- test/noko/client/account_test.rb
|
83
|
-
- test/noko/client/current_user_test.rb
|
84
|
-
- test/noko/client/entries_test.rb
|
85
|
-
- test/noko/client/errors_test.rb
|
86
|
-
- test/noko/client/expenses_test.rb
|
87
|
-
- test/noko/client/invoices_test.rb
|
88
|
-
- test/noko/client/options_test.rb
|
89
|
-
- test/noko/client/project_groups_test.rb
|
90
|
-
- test/noko/client/projects_test.rb
|
91
|
-
- test/noko/client/response_test.rb
|
92
|
-
- test/noko/client/tags_test.rb
|
93
|
-
- test/noko/client/timers_test.rb
|
94
|
-
- test/noko/client/users_test.rb
|
95
|
-
- test/noko/client_test.rb
|
96
|
-
- test/noko/record_test.rb
|
97
42
|
homepage: https://github.com/timcraft/noko
|
98
43
|
licenses:
|
99
44
|
- MIT
|
100
|
-
metadata:
|
45
|
+
metadata:
|
46
|
+
homepage: https://github.com/timcraft/noko
|
47
|
+
source_code_uri: https://github.com/timcraft/noko
|
48
|
+
bug_tracker_uri: https://github.com/timcraft/noko/issues
|
49
|
+
changelog_uri: https://github.com/timcraft/noko/blob/master/CHANGES.md
|
101
50
|
post_install_message:
|
102
51
|
rdoc_options: []
|
103
52
|
require_paths:
|
@@ -113,8 +62,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
62
|
- !ruby/object:Gem::Version
|
114
63
|
version: '0'
|
115
64
|
requirements: []
|
116
|
-
rubygems_version: 3.
|
65
|
+
rubygems_version: 3.1.2
|
117
66
|
signing_key:
|
118
67
|
specification_version: 4
|
119
|
-
summary:
|
68
|
+
summary: See description
|
120
69
|
test_files: []
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientCurrentUserTest < ClientTest
|
4
|
-
def test_get_current_user
|
5
|
-
expect_request(:get, "#{base_url}/current_user").with(auth_header).to_return(json_response)
|
6
|
-
|
7
|
-
assert_instance_of Noko::Record, client.get_current_user
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_get_current_user_entries
|
11
|
-
expect_request(:get, "#{base_url}/current_user/entries").with(auth_header).to_return(json_array_response)
|
12
|
-
|
13
|
-
assert_equal [], client.get_current_user_entries
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_get_current_user_entries_encodes_params
|
17
|
-
expect_request(:get, "#{base_url}/current_user/entries?billable=true")
|
18
|
-
|
19
|
-
client.get_current_user_entries(billable: true)
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_get_current_user_expenses
|
23
|
-
expect_request(:get, "#{base_url}/current_user/expenses").with(auth_header).to_return(json_array_response)
|
24
|
-
|
25
|
-
assert_equal [], client.get_current_user_expenses
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_get_current_user_expenses_encodes_params
|
29
|
-
expect_request(:get, "#{base_url}/current_user/expenses?invoiced=true")
|
30
|
-
|
31
|
-
client.get_current_user_expenses(invoiced: true)
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_update_current_user
|
35
|
-
expect_request(:put, "#{base_url}/current_user").with(json_request).to_return(json_response)
|
36
|
-
|
37
|
-
assert_instance_of Noko::Record, client.update_current_user(week_start: 'monday')
|
38
|
-
end
|
39
|
-
end
|
@@ -1,91 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientEntriesTest < ClientTest
|
4
|
-
def time
|
5
|
-
Time.now.utc
|
6
|
-
end
|
7
|
-
|
8
|
-
def date
|
9
|
-
Date.parse('2019-03-04')
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_get_entries
|
13
|
-
expect_request(:get, "#{base_url}/entries").with(auth_header).to_return(json_array_response)
|
14
|
-
|
15
|
-
assert_equal [], client.get_entries
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_get_entries_encodes_params
|
19
|
-
expect_request(:get, "#{base_url}/entries?billable=true")
|
20
|
-
|
21
|
-
client.get_entries(billable: true)
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_get_entries_encodes_project_ids
|
25
|
-
expect_request(:get, "#{base_url}/entries?project_ids=123,456,789")
|
26
|
-
|
27
|
-
client.get_entries(project_ids: ids)
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_get_entry
|
31
|
-
expect_request(:get, "#{base_url}/entries/#{id}").with(auth_header).to_return(json_response)
|
32
|
-
|
33
|
-
assert_instance_of Noko::Record, client.get_entry(id)
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_create_entry
|
37
|
-
expect_request(:post, "#{base_url}/entries").with(json_request).to_return(json_response.merge(status: 201))
|
38
|
-
|
39
|
-
assert_instance_of Noko::Record, client.create_entry(date: Date.today, minutes: 60)
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_update_entry
|
43
|
-
expect_request(:put, "#{base_url}/entries/#{id}").with(json_request).to_return(json_response)
|
44
|
-
|
45
|
-
assert_instance_of Noko::Record, client.update_entry(id, minutes: 120)
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_delete_entry
|
49
|
-
expect_request(:delete, "#{base_url}/entries/#{id}").with(auth_header).to_return(status: 204)
|
50
|
-
|
51
|
-
assert_equal :no_content, client.delete_entry(id)
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_mark_entry_invoiced
|
55
|
-
expect_request(:put, "#{base_url}/entries/#{id}/marked_as_invoiced").with(json_request).to_return(status: 204)
|
56
|
-
|
57
|
-
assert_equal :no_content, client.mark_entry_invoiced(id, date: date)
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_mark_entries_invoiced
|
61
|
-
expect_request(:put, "#{base_url}/entries/marked_as_invoiced").with(json_request).to_return(status: 204)
|
62
|
-
|
63
|
-
assert_equal :no_content, client.mark_entries_invoiced(entry_ids: ids, date: date)
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_mark_entry_approved
|
67
|
-
body = /\A{"approved_at":"\d{4}\-\d{2}\-\d{2}T\d{2}:\d{2}:\d{2}Z"}\z/
|
68
|
-
|
69
|
-
expect_request(:put, "#{base_url}/entries/#{id}/approved").with(json_request(body)).to_return(status: 204)
|
70
|
-
|
71
|
-
assert_equal :no_content, client.mark_entry_approved(id, approved_at: time.iso8601)
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_mark_entries_approved
|
75
|
-
expect_request(:put, "#{base_url}/entries/approved").with(json_request).to_return(status: 204)
|
76
|
-
|
77
|
-
assert_equal :no_content, client.mark_entries_approved(entry_ids: ids, approved_at: time)
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_mark_entry_unapproved
|
81
|
-
expect_request(:put, "#{base_url}/entries/#{id}/unapproved").with(headers: {'X-NokoToken' => token}).to_return(status: 204)
|
82
|
-
|
83
|
-
assert_equal :no_content, client.mark_entry_unapproved(id)
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_mark_entries_unapproved
|
87
|
-
expect_request(:put, "#{base_url}/entries/unapproved").with(json_request).to_return(status: 204)
|
88
|
-
|
89
|
-
assert_equal :no_content, client.mark_entries_unapproved(entry_ids: ids)
|
90
|
-
end
|
91
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientErrorsTest < ClientTest
|
4
|
-
def test_bad_request_errors
|
5
|
-
message = 'The Project cannot be deleted because it has entries, expenses, or invoices.'
|
6
|
-
|
7
|
-
response = json_response.merge(status: 400, body: %({"message":"#{message}"}))
|
8
|
-
|
9
|
-
stub_request(:delete, "#{base_url}/projects/#{id}").to_return(response)
|
10
|
-
|
11
|
-
exception = assert_raises(Noko::Error) do
|
12
|
-
client.delete_project(id)
|
13
|
-
end
|
14
|
-
|
15
|
-
assert_includes exception.message, message
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_authentication_errors
|
19
|
-
response = json_response.merge(status: 401)
|
20
|
-
|
21
|
-
stub_request(:get, "#{base_url}/entries").to_return(response)
|
22
|
-
|
23
|
-
assert_raises(Noko::AuthenticationError) do
|
24
|
-
client.get_entries
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientExpensesTest < ClientTest
|
4
|
-
def test_get_expenses
|
5
|
-
expect_request(:get, "#{base_url}/expenses").with(auth_header).to_return(json_array_response)
|
6
|
-
|
7
|
-
assert_equal [], client.get_expenses
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_get_expenses_encodes_params
|
11
|
-
expect_request(:get, "#{base_url}/expenses?invoiced=true")
|
12
|
-
|
13
|
-
client.get_expenses(invoiced: true)
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_get_expenses_encodes_ids
|
17
|
-
expect_request(:get, "#{base_url}/expenses?project_ids=123,456,789")
|
18
|
-
|
19
|
-
client.get_expenses(project_ids: ids)
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_get_expense
|
23
|
-
expect_request(:get, "#{base_url}/expenses/#{id}").with(auth_header).to_return(json_response)
|
24
|
-
|
25
|
-
assert_instance_of Noko::Record, client.get_expense(id)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_create_expense
|
29
|
-
expect_request(:post, "#{base_url}/expenses").with(json_request).to_return(json_response.merge(status: 201))
|
30
|
-
|
31
|
-
assert_instance_of Noko::Record, client.create_expense(date: Date.today, project_id: id, price: '14.55')
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_update_expense
|
35
|
-
expect_request(:put, "#{base_url}/expenses/#{id}").with(json_request).to_return(json_response)
|
36
|
-
|
37
|
-
assert_instance_of Noko::Record, client.update_expense(id, price: '19.99')
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_delete_expense
|
41
|
-
expect_request(:delete, "#{base_url}/expenses/#{id}").with(auth_header).to_return(status: 204)
|
42
|
-
|
43
|
-
assert_equal :no_content, client.delete_expense(id)
|
44
|
-
end
|
45
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientInvoicesTest < ClientTest
|
4
|
-
def test_get_invoices
|
5
|
-
expect_request(:get, "#{base_url}/invoices").with(auth_header).to_return(json_array_response)
|
6
|
-
|
7
|
-
assert_equal [], client.get_invoices
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_get_invoices_encodes_params
|
11
|
-
expect_request(:get, "#{base_url}/invoices?state=unpaid")
|
12
|
-
|
13
|
-
client.get_invoices(state: :unpaid)
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_get_invoice
|
17
|
-
expect_request(:get, "#{base_url}/invoices/#{id}").with(auth_header).to_return(json_response)
|
18
|
-
|
19
|
-
assert_instance_of Noko::Record, client.get_invoice(id)
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_create_invoice
|
23
|
-
expect_request(:post, "#{base_url}/invoices").with(json_request).to_return(json_response.merge(status: 201))
|
24
|
-
|
25
|
-
assert_instance_of Noko::Record, client.create_invoice(invoice_date: Date.today)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_update_invoice
|
29
|
-
expect_request(:put, "#{base_url}/invoices/#{id}").with(json_request).to_return(json_response)
|
30
|
-
|
31
|
-
assert_instance_of Noko::Record, client.update_invoice(id, reference: 'AB 0001')
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_mark_invoice_paid
|
35
|
-
expect_request(:put, "#{base_url}/invoices/#{id}/paid").with(auth_header).to_return(status: 204)
|
36
|
-
|
37
|
-
assert_equal :no_content, client.mark_invoice_paid(id)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_mark_invoice_unpaid
|
41
|
-
expect_request(:put, "#{base_url}/invoices/#{id}/unpaid").with(auth_header).to_return(status: 204)
|
42
|
-
|
43
|
-
assert_equal :no_content, client.mark_invoice_unpaid(id)
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_get_invoice_entries
|
47
|
-
expect_request(:get, "#{base_url}/invoices/#{id}/entries").with(auth_header).to_return(json_array_response)
|
48
|
-
|
49
|
-
assert_equal [], client.get_invoice_entries(id)
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_get_invoice_entries_encodes_params
|
53
|
-
expect_request(:get, "#{base_url}/invoices/#{id}/entries?billable=true")
|
54
|
-
|
55
|
-
client.get_invoice_entries(id, billable: true)
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_get_invoice_expenses
|
59
|
-
expect_request(:get, "#{base_url}/invoices/#{id}/expenses").with(auth_header).to_return(json_array_response)
|
60
|
-
|
61
|
-
assert_equal [], client.get_invoice_expenses(id)
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_get_invoice_expenses_encodes_params
|
65
|
-
expect_request(:get, "#{base_url}/invoices/#{id}/expenses?invoiced=false")
|
66
|
-
|
67
|
-
client.get_invoice_expenses(id, invoiced: false)
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_delete_invoice
|
71
|
-
expect_request(:delete, "#{base_url}/invoices/#{id}").with(auth_header).to_return(status: 204)
|
72
|
-
|
73
|
-
assert_equal :no_content, client.delete_invoice(id)
|
74
|
-
end
|
75
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientOptionsTest < ClientTest
|
4
|
-
def user_agent
|
5
|
-
'account.nokotime.com'
|
6
|
-
end
|
7
|
-
|
8
|
-
def access_token
|
9
|
-
'oauth2-access-token'
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_user_agent_option
|
13
|
-
client = Noko::Client.new(token: token, user_agent: user_agent)
|
14
|
-
|
15
|
-
expect_request(:get, "#{base_url}/entries").with(headers: {'User-Agent' => user_agent})
|
16
|
-
|
17
|
-
client.get_entries
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_access_token_option
|
21
|
-
client = Noko::Client.new(access_token: access_token)
|
22
|
-
|
23
|
-
expect_request(:get, "#{base_url}/entries").with(headers: {'Authorization' => 'token oauth2-access-token'})
|
24
|
-
|
25
|
-
client.get_entries
|
26
|
-
end
|
27
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientProjectGroupsTest < ClientTest
|
4
|
-
def test_get_project_groups
|
5
|
-
expect_request(:get, "#{base_url}/project_groups").with(auth_header).to_return(json_array_response)
|
6
|
-
|
7
|
-
assert_equal [], client.get_project_groups
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_get_project_groups_encodes_params
|
11
|
-
expect_request(:get, "#{base_url}/project_groups?name=Sprockets")
|
12
|
-
|
13
|
-
client.get_project_groups(name: 'Sprockets')
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_get_project_group
|
17
|
-
expect_request(:get, "#{base_url}/project_groups/#{id}").with(auth_header).to_return(json_response)
|
18
|
-
|
19
|
-
assert_instance_of Noko::Record, client.get_project_group(id)
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_create_project_group
|
23
|
-
expect_request(:post, "#{base_url}/project_groups").with(json_request).to_return(json_response.merge(status: 201))
|
24
|
-
|
25
|
-
assert_instance_of Noko::Record, client.create_project_group(name: 'Sprockets, Inc.')
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_get_project_group_entries
|
29
|
-
expect_request(:get, "#{base_url}/project_groups/#{id}/entries").with(auth_header).to_return(json_array_response)
|
30
|
-
|
31
|
-
assert_equal [], client.get_project_group_entries(id)
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_get_project_group_entries_encodes_params
|
35
|
-
expect_request(:get, "#{base_url}/project_groups/#{id}/entries?billable=true")
|
36
|
-
|
37
|
-
client.get_project_group_entries(id, billable: true)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_get_project_group_projects
|
41
|
-
expect_request(:get, "#{base_url}/project_groups/#{id}/projects").with(auth_header).to_return(json_array_response)
|
42
|
-
|
43
|
-
assert_equal [], client.get_project_group_projects(id)
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_get_project_group_projects_encodes_params
|
47
|
-
expect_request(:get, "#{base_url}/project_groups/#{id}/projects?billable=true")
|
48
|
-
|
49
|
-
client.get_project_group_projects(id, billable: true)
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_update_project_group
|
53
|
-
expect_request(:put, "#{base_url}/project_groups/#{id}").with(json_request).to_return(json_response)
|
54
|
-
|
55
|
-
assert_instance_of Noko::Record, client.update_project_group(id, name: 'Sprockets, Inc.')
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_delete_project_group
|
59
|
-
expect_request(:delete, "#{base_url}/project_groups/#{id}").with(auth_header).to_return(status: 204)
|
60
|
-
|
61
|
-
assert_equal :no_content, client.delete_project_group(id)
|
62
|
-
end
|
63
|
-
end
|
@@ -1,99 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientProjectsTest < ClientTest
|
4
|
-
def test_get_projects
|
5
|
-
expect_request(:get, "#{base_url}/projects").with(auth_header).to_return(json_array_response)
|
6
|
-
|
7
|
-
assert_equal [], client.get_projects
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_get_projects_encodes_params
|
11
|
-
expect_request(:get, "#{base_url}/projects?billable=true")
|
12
|
-
|
13
|
-
client.get_projects(billable: true)
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_get_project
|
17
|
-
expect_request(:get, "#{base_url}/projects/#{id}").with(auth_header).to_return(json_response)
|
18
|
-
|
19
|
-
assert_instance_of Noko::Record, client.get_project(id)
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_create_project
|
23
|
-
expect_request(:post, "#{base_url}/projects").with(json_request).to_return(json_response.merge(status: 201))
|
24
|
-
|
25
|
-
assert_instance_of Noko::Record, client.create_project(name: 'Gear GmbH')
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_get_project_entries
|
29
|
-
expect_request(:get, "#{base_url}/projects/#{id}/entries").with(auth_header).to_return(json_array_response)
|
30
|
-
|
31
|
-
assert_equal [], client.get_project_entries(id)
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_get_project_entries_encodes_params
|
35
|
-
expect_request(:get, "#{base_url}/projects/#{id}/entries?billable=true")
|
36
|
-
|
37
|
-
client.get_project_entries(id, billable: true)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_get_project_expenses
|
41
|
-
expect_request(:get, "#{base_url}/projects/#{id}/expenses").with(auth_header).to_return(json_array_response)
|
42
|
-
|
43
|
-
assert_equal [], client.get_project_expenses(id)
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_get_project_expenses_encodes_params
|
47
|
-
expect_request(:get, "#{base_url}/projects/#{id}/expenses?invoiced=true")
|
48
|
-
|
49
|
-
client.get_project_expenses(id, invoiced: true)
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_update_project
|
53
|
-
expect_request(:put, "#{base_url}/projects/#{id}").with(json_request).to_return(json_response)
|
54
|
-
|
55
|
-
assert_instance_of Noko::Record, client.update_project(id, color: '#ff9898')
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_merge_projects
|
59
|
-
expect_request(:put, "#{base_url}/projects/#{id}/merge").with(json_request.merge(body: '{"project_id":5678}')).to_return(status: 204)
|
60
|
-
|
61
|
-
assert_equal :no_content, client.merge_projects(id, 5678)
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_delete_project
|
65
|
-
expect_request(:delete, "#{base_url}/projects/#{id}").with(auth_header).to_return(status: 204)
|
66
|
-
|
67
|
-
assert_equal :no_content, client.delete_project(id)
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_archive_project
|
71
|
-
expect_request(:put, "#{base_url}/projects/#{id}/archive").with(auth_header).to_return(status: 204)
|
72
|
-
|
73
|
-
assert_equal :no_content, client.archive_project(id)
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_unarchive_project
|
77
|
-
expect_request(:put, "#{base_url}/projects/#{id}/unarchive").with(auth_header).to_return(status: 204)
|
78
|
-
|
79
|
-
assert_equal :no_content, client.unarchive_project(id)
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_archive_projects
|
83
|
-
expect_request(:put, "#{base_url}/projects/archive").with(json_request.merge(body: '{"project_ids":[123]}')).to_return(status: 204)
|
84
|
-
|
85
|
-
assert_equal :no_content, client.archive_projects([id])
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_unarchive_projects
|
89
|
-
expect_request(:put, "#{base_url}/projects/unarchive").with(json_request.merge(body: '{"project_ids":[123]}')).to_return(status: 204)
|
90
|
-
|
91
|
-
assert_equal :no_content, client.unarchive_projects([id])
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_delete_projects
|
95
|
-
expect_request(:put, "#{base_url}/projects/delete").with(json_request.merge(body: '{"project_ids":[123]}')).to_return(status: 204)
|
96
|
-
|
97
|
-
assert_equal :no_content, client.delete_projects([id])
|
98
|
-
end
|
99
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientResponseTest < ClientTest
|
4
|
-
def response(headers)
|
5
|
-
{headers: json_response_headers.merge(headers), body: '[]'}
|
6
|
-
end
|
7
|
-
|
8
|
-
def test_rel_next_link
|
9
|
-
link = '<https://api.nokotime.com/v2/entries?page=3>; rel="next"'
|
10
|
-
|
11
|
-
expect_request(:get, "#{base_url}/entries").to_return(response('Link' => link))
|
12
|
-
|
13
|
-
assert_equal '/v2/entries?page=3', client.get_entries.link.next
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_rel_prev_link
|
17
|
-
link = '<https://api.nokotime.com/v2/entries?page=2>; rel="prev"'
|
18
|
-
|
19
|
-
expect_request(:get, "#{base_url}/entries").to_return(response('Link' => link))
|
20
|
-
|
21
|
-
assert_equal '/v2/entries?page=2', client.get_entries.link.prev
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_rel_last_link
|
25
|
-
link = '<https://api.nokotime.com/v2/entries?page=50>; rel="last"'
|
26
|
-
|
27
|
-
expect_request(:get, "#{base_url}/entries").to_return(response('Link' => link))
|
28
|
-
|
29
|
-
assert_equal '/v2/entries?page=50', client.get_entries.link.last
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_rel_first_link
|
33
|
-
link = '<https://api.nokotime.com/v2/entries?page=1>; rel="first"'
|
34
|
-
|
35
|
-
expect_request(:get, "#{base_url}/entries").to_return(response('Link' => link))
|
36
|
-
|
37
|
-
assert_equal '/v2/entries?page=1', client.get_entries.link.first
|
38
|
-
end
|
39
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientTagsTest < ClientTest
|
4
|
-
def test_get_tags
|
5
|
-
expect_request(:get, "#{base_url}/tags").with(auth_header).to_return(json_array_response)
|
6
|
-
|
7
|
-
assert_equal [], client.get_tags
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_get_tags_encodes_params
|
11
|
-
expect_request(:get, "#{base_url}/tags?billable=true")
|
12
|
-
|
13
|
-
client.get_tags(billable: true)
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_create_tags
|
17
|
-
expect_request(:post, "#{base_url}/tags").with(json_request).to_return(json_array_response.merge(status: 201))
|
18
|
-
|
19
|
-
assert_equal [], client.create_tags(%w[freckle])
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_get_tag
|
23
|
-
expect_request(:get, "#{base_url}/tags/#{id}").with(auth_header).to_return(json_response)
|
24
|
-
|
25
|
-
assert_instance_of Noko::Record, client.get_tag(id)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_get_tag_entries
|
29
|
-
expect_request(:get, "#{base_url}/tags/#{id}/entries").with(auth_header).to_return(json_array_response)
|
30
|
-
|
31
|
-
assert_equal [], client.get_tag_entries(id)
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_get_tag_entries_encodes_params
|
35
|
-
expect_request(:get, "#{base_url}/tags/#{id}/entries?billable=true")
|
36
|
-
|
37
|
-
client.get_tag_entries(id, billable: true)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_update_tag
|
41
|
-
expect_request(:put, "#{base_url}/tags/#{id}").with(json_request).to_return(json_response)
|
42
|
-
|
43
|
-
assert_instance_of Noko::Record, client.update_tag(id, name: 'freckle')
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_merge_tags
|
47
|
-
expect_request(:put, "#{base_url}/tags/#{id}/merge").with(json_request.merge(body: '{"tag_id":5678}')).to_return(status: 204)
|
48
|
-
|
49
|
-
assert_equal :no_content, client.merge_tags(id, 5678)
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_delete_tag
|
53
|
-
expect_request(:delete, "#{base_url}/tags/#{id}").with(auth_header).to_return(status: 204)
|
54
|
-
|
55
|
-
assert_equal :no_content, client.delete_tag(id)
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_delete_tags
|
59
|
-
expect_request(:put, "#{base_url}/tags/delete").with(json_request.merge(body: '{"tag_ids":[123]}')).to_return(status: 204)
|
60
|
-
|
61
|
-
assert_equal :no_content, client.delete_tags([id])
|
62
|
-
end
|
63
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientTimersTest < ClientTest
|
4
|
-
def test_get_timers
|
5
|
-
expect_request(:get, "#{base_url}/timers").with(auth_header).to_return(json_array_response)
|
6
|
-
|
7
|
-
assert_equal [], client.get_timers
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_get_timers_encodes_params
|
11
|
-
expect_request(:get, "#{base_url}/timers?billable=true")
|
12
|
-
|
13
|
-
client.get_timers(billable: true)
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_get_timers_encodes_ids
|
17
|
-
expect_request(:get, "#{base_url}/timers?projects=123,456,789")
|
18
|
-
|
19
|
-
client.get_timers(projects: ids)
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_get_timer
|
23
|
-
expect_request(:get, "#{base_url}/projects/#{id}/timer").with(auth_header).to_return(json_response)
|
24
|
-
|
25
|
-
assert_instance_of Noko::Record, client.get_timer(id)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_update_timer
|
29
|
-
expect_request(:put, "#{base_url}/projects/#{id}/timer").with(json_request).to_return(json_response)
|
30
|
-
|
31
|
-
assert_instance_of Noko::Record, client.update_timer(id, description: 'Notes go here')
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_start_timer
|
35
|
-
expect_request(:put, "#{base_url}/projects/#{id}/timer/start").with(auth_header).to_return(json_response)
|
36
|
-
|
37
|
-
assert_instance_of Noko::Record, client.start_timer(id)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_pause_timer
|
41
|
-
expect_request(:put, "#{base_url}/projects/#{id}/timer/pause").with(auth_header).to_return(json_response)
|
42
|
-
|
43
|
-
assert_instance_of Noko::Record, client.pause_timer(id)
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_log_timer
|
47
|
-
expect_request(:put, "#{base_url}/projects/#{id}/timer/log").with(auth_header).to_return(status: 204)
|
48
|
-
|
49
|
-
assert_equal :no_content, client.log_timer(id, description: 'Serious #development work')
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_discard_timer
|
53
|
-
expect_request(:delete, "#{base_url}/projects/#{id}/timer").with(auth_header).to_return(status: 204)
|
54
|
-
|
55
|
-
assert_equal :no_content, client.discard_timer(id)
|
56
|
-
end
|
57
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
require_relative '../client_test'
|
2
|
-
|
3
|
-
class ClientUsersTest < ClientTest
|
4
|
-
def test_get_users
|
5
|
-
expect_request(:get, "#{base_url}/users").with(auth_header).to_return(json_array_response)
|
6
|
-
|
7
|
-
assert_equal [], client.get_users
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_get_users_encodes_params
|
11
|
-
expect_request(:get, "#{base_url}/users?name=John")
|
12
|
-
|
13
|
-
client.get_users(name: 'John')
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_get_user
|
17
|
-
expect_request(:get, "#{base_url}/users/#{id}").with(auth_header).to_return(json_response)
|
18
|
-
|
19
|
-
assert_instance_of Noko::Record, client.get_user(id)
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_get_user_entries
|
23
|
-
expect_request(:get, "#{base_url}/users/#{id}/entries").with(auth_header).to_return(json_array_response)
|
24
|
-
|
25
|
-
assert_equal [], client.get_user_entries(id)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_get_user_entries_encodes_params
|
29
|
-
expect_request(:get, "#{base_url}/users/#{id}/entries?billable=true")
|
30
|
-
|
31
|
-
client.get_user_entries(id, billable: true)
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_get_user_expenses
|
35
|
-
expect_request(:get, "#{base_url}/users/#{id}/expenses").with(auth_header).to_return(json_array_response)
|
36
|
-
|
37
|
-
assert_equal [], client.get_user_expenses(id)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_get_user_expenses_encodes_params
|
41
|
-
expect_request(:get, "#{base_url}/users/#{id}/expenses?invoiced=true")
|
42
|
-
|
43
|
-
client.get_user_expenses(id, invoiced: true)
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_create_user
|
47
|
-
expect_request(:post, "#{base_url}/users").with(json_request).to_return(json_response.merge(status: 201))
|
48
|
-
|
49
|
-
assert_instance_of Noko::Record, client.create_user(email: 'alice@example.com')
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_update_user
|
53
|
-
expect_request(:put, "#{base_url}/users/#{id}").with(json_request).to_return(json_response)
|
54
|
-
|
55
|
-
assert_instance_of Noko::Record, client.update_user(id, role: 'leader')
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_delete_user
|
59
|
-
expect_request(:delete, "#{base_url}/users/#{id}").with(auth_header).to_return(status: 204)
|
60
|
-
|
61
|
-
assert_equal :no_content, client.delete_user(id)
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_reactivate_user
|
65
|
-
expect_request(:put, "#{base_url}/users/#{id}/activate").with(auth_header).to_return(status: 204)
|
66
|
-
|
67
|
-
assert_equal :no_content, client.reactivate_user(id)
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_deactivate_user
|
71
|
-
expect_request(:put, "#{base_url}/users/#{id}/deactivate").with(auth_header).to_return(status: 204)
|
72
|
-
|
73
|
-
assert_equal :no_content, client.deactivate_user(id)
|
74
|
-
end
|
75
|
-
end
|
data/test/noko/client_test.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'minitest/autorun'
|
2
|
-
require 'webmock/minitest'
|
3
|
-
require 'noko'
|
4
|
-
|
5
|
-
class ClientTest < Minitest::Test
|
6
|
-
def token
|
7
|
-
'token-xxx'
|
8
|
-
end
|
9
|
-
|
10
|
-
def id
|
11
|
-
123
|
12
|
-
end
|
13
|
-
|
14
|
-
def ids
|
15
|
-
%w[123 456 789]
|
16
|
-
end
|
17
|
-
|
18
|
-
def base_url
|
19
|
-
'https://api.nokotime.com/v2'
|
20
|
-
end
|
21
|
-
|
22
|
-
def auth_header
|
23
|
-
{headers: {'X-NokoToken' => token}}
|
24
|
-
end
|
25
|
-
|
26
|
-
def json_request(body=/\A{.+}\z/)
|
27
|
-
{headers: {'X-NokoToken' => token, 'Content-Type' => 'application/json'}, body: body}
|
28
|
-
end
|
29
|
-
|
30
|
-
def json_response_headers
|
31
|
-
{'Content-Type' => 'application/json;charset=utf-8'}
|
32
|
-
end
|
33
|
-
|
34
|
-
def json_response
|
35
|
-
{headers: json_response_headers, body: '{}'}
|
36
|
-
end
|
37
|
-
|
38
|
-
def json_array_response
|
39
|
-
{headers: json_response_headers, body: '[]'}
|
40
|
-
end
|
41
|
-
|
42
|
-
attr_accessor :client
|
43
|
-
attr_accessor :request
|
44
|
-
|
45
|
-
def setup
|
46
|
-
WebMock.reset!
|
47
|
-
|
48
|
-
self.client = Noko::Client.new(token: token)
|
49
|
-
self.request = nil
|
50
|
-
end
|
51
|
-
|
52
|
-
def teardown
|
53
|
-
assert_requested(request) if request
|
54
|
-
end
|
55
|
-
|
56
|
-
def expect_request(*args)
|
57
|
-
self.request = stub_request(*args)
|
58
|
-
end
|
59
|
-
end
|
data/test/noko/record_test.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'minitest/autorun'
|
2
|
-
require 'noko'
|
3
|
-
|
4
|
-
class RecordTest < Minitest::Test
|
5
|
-
def id
|
6
|
-
123
|
7
|
-
end
|
8
|
-
|
9
|
-
attr_accessor :record
|
10
|
-
|
11
|
-
def setup
|
12
|
-
self.record = Noko::Record.new(project_id: id)
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_square_brackets_returns_attribute_values
|
16
|
-
assert_equal id, record[:project_id]
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_method_missing_returns_attribute_values
|
20
|
-
assert_equal id, record.project_id
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_to_h_returns_attributes_hash
|
24
|
-
attributes = {project_id: id}
|
25
|
-
|
26
|
-
assert_equal attributes, record.to_h
|
27
|
-
end
|
28
|
-
end
|