harv 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/HISTORY +3 -0
  2. data/LICENSE +23 -0
  3. data/README.rdoc +173 -0
  4. data/Rakefile +44 -0
  5. data/lib/harvest/base.rb +118 -0
  6. data/lib/harvest/harvest_resource.rb +15 -0
  7. data/lib/harvest/plugins/active_resource_inheritable_headers.rb +36 -0
  8. data/lib/harvest/plugins/toggleable.rb +12 -0
  9. data/lib/harvest/resources/client.rb +34 -0
  10. data/lib/harvest/resources/entry.rb +34 -0
  11. data/lib/harvest/resources/expense.rb +22 -0
  12. data/lib/harvest/resources/expense_category.rb +7 -0
  13. data/lib/harvest/resources/person.rb +44 -0
  14. data/lib/harvest/resources/project.rb +51 -0
  15. data/lib/harvest/resources/task.rb +8 -0
  16. data/lib/harvest/resources/task_assignment.rb +27 -0
  17. data/lib/harvest/resources/user_assignment.rb +27 -0
  18. data/lib/harvest.rb +37 -0
  19. data/test/integration/client_integration.rb +17 -0
  20. data/test/integration/client_teardown.rb +11 -0
  21. data/test/integration/expense_category_integration.rb +16 -0
  22. data/test/integration/expense_category_teardown.rb +12 -0
  23. data/test/integration/harvest_integration_test.rb +47 -0
  24. data/test/integration/project_integration.rb +19 -0
  25. data/test/integration/project_teardown.rb +12 -0
  26. data/test/integration/task_integration.rb +19 -0
  27. data/test/integration/task_teardown.rb +12 -0
  28. data/test/test_helper.rb +51 -0
  29. data/test/unit/base_test.rb +84 -0
  30. data/test/unit/resources/client_test.rb +82 -0
  31. data/test/unit/resources/expense_category_test.rb +49 -0
  32. data/test/unit/resources/expense_test.rb +14 -0
  33. data/test/unit/resources/person_test.rb +150 -0
  34. data/test/unit/resources/project_test.rb +154 -0
  35. data/test/unit/resources/task_assignment_test.rb +72 -0
  36. data/test/unit/resources/task_test.rb +82 -0
  37. data/test/unit/resources/user_assignment_test.rb +71 -0
  38. metadata +137 -0
@@ -0,0 +1,154 @@
1
+ require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
2
+
3
+ class ProjectTest < Test::Unit::TestCase
4
+
5
+ def setup_resources
6
+ @project_xml = {:id => 1, :name => "Widget Redesign"}.to_xml(:root => "project")
7
+ @projects = [{:id => 1, :name => "Widget Redesign"}].to_xml(:root => "projects")
8
+ @entry = [{:id => 2, :project_id => 50}].to_xml(:root => "day-entries")
9
+ @entries = [{:id => 1, :project_id => "25"},
10
+ {:id => 2, :project_id => 50}].to_xml(:root => "day-entries")
11
+ @user_assignment = {:id => 1, :user_id => 5}.to_xml(:root => "user-assignment")
12
+ end
13
+
14
+ def mock_responses
15
+ ActiveResource::HttpMock.respond_to do |mock|
16
+ mock.get "/projects.xml", {}, @projects
17
+ mock.get "/projects/1.xml", {}, @project_xml
18
+ mock.post "/projects.xml", {}, @project, 201, "Location" => "/projects/5.xml"
19
+ mock.put "/projects/1.xml", {}, nil, 200
20
+ mock.delete "/projects/1.xml", {}, nil, 200
21
+ mock.put "/projects/1/toggle.xml", {}, nil, 200
22
+ mock.get "/projects/1/entries.xml?from=20080101&to=20080131", {}, @entries
23
+ mock.get "/projects/1/entries.xml?from=20080101&to=20080131&user_id=3", {}, @entry
24
+ end
25
+ end
26
+
27
+ context "Project CRUD actions -- " do
28
+ setup do
29
+ setup_resources
30
+ mock_responses
31
+ end
32
+
33
+ should "get index" do
34
+ Harvest::Resources::Project.find(:all)
35
+ expected_request = ActiveResource::Request.new(:get, "/projects.xml")
36
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
37
+ end
38
+
39
+ should "get a single project" do
40
+ Harvest::Resources::Project.find(1)
41
+ expected_request = ActiveResource::Request.new(:get, "/projects/1.xml")
42
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
43
+ end
44
+
45
+ should "create a new project" do
46
+ project = Harvest::Resources::Project.new(:name => "Widgets&Co")
47
+ project.save
48
+ expected_request = ActiveResource::Request.new(:post, "/projects.xml")
49
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
50
+ end
51
+
52
+ should "update an existing project" do
53
+ project = Harvest::Resources::Project.find(1)
54
+ project.name = "Sprockets & Co"
55
+ project.save
56
+ expected_request = ActiveResource::Request.new(:put, "/projects/1.xml")
57
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
58
+ end
59
+
60
+ should "delete an existing project" do
61
+ Harvest::Resources::Project.delete(1)
62
+ expected_request = ActiveResource::Request.new(:delete, "/projects/1.xml")
63
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
64
+ end
65
+
66
+ end
67
+
68
+ context "Toggling active/inactive status" do
69
+ setup do
70
+ setup_resources
71
+ mock_responses
72
+ end
73
+
74
+ should "hit the toggle method" do
75
+ project = Harvest::Resources::Project.find(1)
76
+ project.toggle
77
+ expected_request = ActiveResource::Request.new(:put, "/projects/1/toggle.xml")
78
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
79
+ end
80
+
81
+ should "return 200 Success toggle method" do
82
+ project = Harvest::Resources::Project.find(1)
83
+ assert project.toggle.code == 200
84
+ end
85
+
86
+ end
87
+
88
+ context "Nesting " do
89
+ setup do
90
+ setup_resources
91
+ mock_responses
92
+ @project = Harvest::Resources::Project.find(1)
93
+ end
94
+
95
+ should "get user assignments" do
96
+ end
97
+
98
+ should "get task assignments" do
99
+ end
100
+
101
+ end
102
+
103
+ context "Listing entries" do
104
+ setup do
105
+ setup_resources
106
+ mock_responses
107
+ @project = Harvest::Resources::Project.find(1)
108
+ end
109
+
110
+ should "raise an error if start and end are not included" do
111
+ assert_raises ArgumentError, "Must specify :start and :end as dates." do
112
+ @project.entries
113
+ end
114
+ end
115
+
116
+ should "raise an error if end date precedes start date" do
117
+ assert_raises ArgumentError, "Must specify :start and :end as dates." do
118
+ @project.entries(:from => Time.utc(2007, 1, 1), :to => Time.utc(2006, 1, 1))
119
+ end
120
+ end
121
+
122
+ should "return the project site prefix" do
123
+ entry_class = Harvest::Resources::Entry.clone
124
+ entry_class.project_id = @project.id
125
+ assert_equal "http://example.com/projects/1", entry_class.site.to_s
126
+ end
127
+
128
+ end
129
+
130
+ context "Reports -- " do
131
+ setup do
132
+ setup_resources
133
+ mock_responses
134
+ @from = Time.utc(2008, 1, 1)
135
+ @to = Time.utc(2008, 1, 31)
136
+ @project = Harvest::Resources::Project.find(1)
137
+ @request_path = "/projects/1/entries.xml?from=20080101&to=20080131"
138
+ end
139
+
140
+ should "get all entries for a given date range" do
141
+ @project.entries(:from => @from, :to => @to)
142
+ expected_request = ActiveResource::Request.new(:get, @request_path)
143
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
144
+ end
145
+
146
+ should "get all entries for the given date range and user" do
147
+ @project.entries(:from => @from, :to => @to, :user_id => 3)
148
+ expected_request = ActiveResource::Request.new(:get, @request_path + "&user_id=3")
149
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
150
+ end
151
+
152
+ end
153
+
154
+ end
@@ -0,0 +1,72 @@
1
+ require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
2
+
3
+ class ExpenseAssignmentTest < Test::Unit::TestCase
4
+
5
+ def setup_resources
6
+ @task_assignment = {:id => 1, :project_id => 5}.to_xml(:root => "task_assignment")
7
+ @task_assignments = [{:id => 1, :project_id => 5}].to_xml(:root => "task_assignments")
8
+ end
9
+
10
+ def mock_responses
11
+ ActiveResource::HttpMock.respond_to do |mock|
12
+ mock.get "/task_assignments.xml", {}, @task_assignments
13
+ mock.get "/task_assignments/1.xml", {}, @task_assignment
14
+ mock.post "/task_assignments.xml", {}, @task_assignment, 201, "Location" => "/task_assignments/5.xml"
15
+ mock.put "/task_assignments/1.xml", {}, nil, 200
16
+ mock.delete "/task_assignments/1.xml", {}, nil, 200
17
+ mock.put "/task_assignments/1/toggle.xml", {}, nil, 200
18
+ end
19
+ end
20
+
21
+ context "task_assignment actions" do
22
+ setup do
23
+ setup_resources
24
+ mock_responses
25
+ end
26
+
27
+ should "get index" do
28
+ Harvest::Resources::TaskAssignment.find(:all)
29
+ expected_request = ActiveResource::Request.new(:get, "/task_assignments.xml")
30
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
31
+ end
32
+
33
+ should "get a single task_assignment" do
34
+ Harvest::Resources::TaskAssignment.find(1)
35
+ expected_request = ActiveResource::Request.new(:get, "/task_assignments/1.xml")
36
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
37
+ end
38
+
39
+ should "create a new task_assignment" do
40
+ task_assignment = Harvest::Resources::TaskAssignment.new(:project_id => 5)
41
+ task_assignment.save
42
+ expected_request = ActiveResource::Request.new(:post, "/task_assignments.xml")
43
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
44
+ end
45
+
46
+ should "update an existing task_assignment" do
47
+ task_assignment = Harvest::Resources::TaskAssignment.find(1)
48
+ task_assignment.name = "Admin"
49
+ task_assignment.save
50
+ expected_request = ActiveResource::Request.new(:put, "/task_assignments/1.xml")
51
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
52
+ end
53
+
54
+ should "delete an existing task_assignment" do
55
+ Harvest::Resources::TaskAssignment.delete(1)
56
+ expected_request = ActiveResource::Request.new(:delete, "/task_assignments/1.xml")
57
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
58
+ end
59
+
60
+ end
61
+
62
+ context "TaskAssignment class" do
63
+
64
+ should "adjust the site setting when the project_id is set" do
65
+ task_class = Harvest::Resources::TaskAssignment.clone
66
+ task_class.project_id = 5
67
+ assert_equal "http://example.com/projects/5", task_class.site.to_s
68
+ end
69
+
70
+ end
71
+
72
+ end
@@ -0,0 +1,82 @@
1
+ require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
2
+
3
+ class TaskTest < Test::Unit::TestCase
4
+
5
+ def setup_resources
6
+ @task = {:id => 1, :name => "Admin"}.to_xml(:root => "task")
7
+ @tasks = [{:id => 1, :name => "Admin"}].to_xml(:root => "tasks")
8
+ end
9
+
10
+ def mock_responses
11
+ ActiveResource::HttpMock.respond_to do |mock|
12
+ mock.get "/tasks.xml", {}, @tasks
13
+ mock.get "/tasks/1.xml", {}, @task
14
+ mock.post "/tasks.xml", {}, @task, 201, "Location" => "/tasks/5.xml"
15
+ mock.put "/tasks/1.xml", {}, nil, 200
16
+ mock.delete "/tasks/1.xml", {}, nil, 200
17
+ mock.put "/tasks/1/toggle.xml", {}, nil, 200
18
+ end
19
+ end
20
+
21
+ context "Task actions" do
22
+ setup do
23
+ setup_resources
24
+ mock_responses
25
+ end
26
+
27
+ should "get index" do
28
+ Harvest::Resources::Task.find(:all)
29
+ expected_request = ActiveResource::Request.new(:get, "/tasks.xml")
30
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
31
+ end
32
+
33
+ should "get a single task" do
34
+ Harvest::Resources::Task.find(1)
35
+ expected_request = ActiveResource::Request.new(:get, "/tasks/1.xml")
36
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
37
+ end
38
+
39
+ should "create a new task" do
40
+ task = Harvest::Resources::Task.new(:name => "Admin")
41
+ task.save
42
+ expected_request = ActiveResource::Request.new(:post, "/tasks.xml")
43
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
44
+ end
45
+
46
+ should "update an existing task" do
47
+ task = Harvest::Resources::Task.find(1)
48
+ task.name = "Admin"
49
+ task.save
50
+ expected_request = ActiveResource::Request.new(:put, "/tasks/1.xml")
51
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
52
+ end
53
+
54
+ should "delete an existing task" do
55
+ Harvest::Resources::Task.delete(1)
56
+ expected_request = ActiveResource::Request.new(:delete, "/tasks/1.xml")
57
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
58
+ end
59
+
60
+ end
61
+
62
+ context "Toggling active/inactive status" do
63
+ setup do
64
+ setup_resources
65
+ mock_responses
66
+ end
67
+
68
+ should "hit the toggle method" do
69
+ task = Harvest::Resources::Task.find(1)
70
+ task.toggle
71
+ expected_request = ActiveResource::Request.new(:put, "/tasks/1/toggle.xml")
72
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
73
+ end
74
+
75
+ should "return 200 Success toggle method" do
76
+ task = Harvest::Resources::Task.find(1)
77
+ assert task.toggle.code == 200
78
+ end
79
+
80
+ end
81
+
82
+ end
@@ -0,0 +1,71 @@
1
+ require File.join(File.dirname(__FILE__), "..", "..", "test_helper")
2
+
3
+ class UserAssignmentTest < Test::Unit::TestCase
4
+
5
+ def setup_resources
6
+ @user_assignment = {:id => 1, :project_id => 5}.to_xml(:root => "user_assignment")
7
+ @user_assignments = [{:id => 1, :project_id => 5}].to_xml(:root => "user_assignments")
8
+ end
9
+
10
+ def mock_responses
11
+ ActiveResource::HttpMock.respond_to do |mock|
12
+ mock.get "/user_assignments.xml", {}, @user_assignments
13
+ mock.get "/user_assignments/1.xml", {}, @user_assignment
14
+ mock.post "/user_assignments.xml", {}, @user_assignment, 201, "Location" => "/user_assignments/5.xml"
15
+ mock.put "/user_assignments/1.xml", {}, nil, 200
16
+ mock.delete "/user_assignments/1.xml", {}, nil, 200
17
+ mock.put "/user_assignments/1/toggle.xml", {}, nil, 200
18
+ end
19
+ end
20
+
21
+ context "user_assignment actions" do
22
+ setup do
23
+ setup_resources
24
+ mock_responses
25
+ end
26
+
27
+ should "get index" do
28
+ Harvest::Resources::UserAssignment.find(:all)
29
+ expected_request = ActiveResource::Request.new(:get, "/user_assignments.xml")
30
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
31
+ end
32
+
33
+ should "get a single user_assignment" do
34
+ Harvest::Resources::UserAssignment.find(1)
35
+ expected_request = ActiveResource::Request.new(:get, "/user_assignments/1.xml")
36
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
37
+ end
38
+
39
+ should "create a new user_assignment" do
40
+ user_assignment = Harvest::Resources::UserAssignment.new(:project_id => 5)
41
+ user_assignment.save
42
+ expected_request = ActiveResource::Request.new(:post, "/user_assignments.xml")
43
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
44
+ end
45
+
46
+ should "update an existing user_assignment" do
47
+ user_assignment = Harvest::Resources::UserAssignment.find(1)
48
+ user_assignment.name = "Admin"
49
+ user_assignment.save
50
+ expected_request = ActiveResource::Request.new(:put, "/user_assignments/1.xml")
51
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
52
+ end
53
+
54
+ should "delete an existing user_assignment" do
55
+ Harvest::Resources::UserAssignment.delete(1)
56
+ expected_request = ActiveResource::Request.new(:delete, "/user_assignments/1.xml")
57
+ assert ActiveResource::HttpMock.requests.include?(expected_request)
58
+ end
59
+
60
+ end
61
+
62
+ context "UserAssignment class" do
63
+
64
+ should "adjust the site setting when the project_id is set" do
65
+ user_class = Harvest::Resources::UserAssignment.clone
66
+ user_class.project_id = 5
67
+ assert_equal "http://example.com/projects/5", user_class.site.to_s
68
+ end
69
+
70
+ end
71
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: harv
3
+ version: !ruby/object:Gem::Version
4
+ hash: 57
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 8
9
+ - 3
10
+ version: 0.8.3
11
+ platform: ruby
12
+ authors:
13
+ - Kyle Banker
14
+ - Alexander Interactive, Inc.
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2010-06-24 00:00:00 +04:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: activeresource
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ hash: 1
31
+ segments:
32
+ - 2
33
+ - 1
34
+ version: "2.1"
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ description:
38
+ email: anthony.icerock@gmail.com
39
+ executables: []
40
+
41
+ extensions: []
42
+
43
+ extra_rdoc_files:
44
+ - README.rdoc
45
+ files:
46
+ - HISTORY
47
+ - LICENSE
48
+ - Rakefile
49
+ - README.rdoc
50
+ - lib/harvest/plugins/active_resource_inheritable_headers.rb
51
+ - lib/harvest/plugins/toggleable.rb
52
+ - lib/harvest/resources/client.rb
53
+ - lib/harvest/resources/entry.rb
54
+ - lib/harvest/resources/expense.rb
55
+ - lib/harvest/resources/expense_category.rb
56
+ - lib/harvest/resources/person.rb
57
+ - lib/harvest/resources/project.rb
58
+ - lib/harvest/resources/task.rb
59
+ - lib/harvest/resources/task_assignment.rb
60
+ - lib/harvest/resources/user_assignment.rb
61
+ - lib/harvest/base.rb
62
+ - lib/harvest/harvest_resource.rb
63
+ - lib/harvest.rb
64
+ - test/test_helper.rb
65
+ - test/unit/base_test.rb
66
+ - test/unit/resources/client_test.rb
67
+ - test/unit/resources/expense_test.rb
68
+ - test/unit/resources/expense_category_test.rb
69
+ - test/unit/resources/person_test.rb
70
+ - test/unit/resources/project_test.rb
71
+ - test/unit/resources/task_test.rb
72
+ - test/unit/resources/task_assignment_test.rb
73
+ - test/unit/resources/user_assignment_test.rb
74
+ - test/integration/client_integration.rb
75
+ - test/integration/task_integration.rb
76
+ - test/integration/expense_category_integration.rb
77
+ - test/integration/project_integration.rb
78
+ - test/integration/harvest_integration_test.rb
79
+ - test/integration/client_teardown.rb
80
+ - test/integration/expense_category_teardown.rb
81
+ - test/integration/project_teardown.rb
82
+ - test/integration/task_teardown.rb
83
+ has_rdoc: true
84
+ homepage: http://github.com/icerock/harvest
85
+ licenses: []
86
+
87
+ post_install_message:
88
+ rdoc_options:
89
+ - --main
90
+ - README.rdoc
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ hash: 3
108
+ segments:
109
+ - 0
110
+ version: "0"
111
+ requirements: []
112
+
113
+ rubyforge_project:
114
+ rubygems_version: 1.3.7
115
+ signing_key:
116
+ specification_version: 3
117
+ summary: A wrapper for the Harvest Api. See http://getharvest.com/api for details.
118
+ test_files:
119
+ - test/test_helper.rb
120
+ - test/unit/base_test.rb
121
+ - test/unit/resources/client_test.rb
122
+ - test/unit/resources/expense_test.rb
123
+ - test/unit/resources/expense_category_test.rb
124
+ - test/unit/resources/person_test.rb
125
+ - test/unit/resources/project_test.rb
126
+ - test/unit/resources/task_test.rb
127
+ - test/unit/resources/task_assignment_test.rb
128
+ - test/unit/resources/user_assignment_test.rb
129
+ - test/integration/client_integration.rb
130
+ - test/integration/task_integration.rb
131
+ - test/integration/expense_category_integration.rb
132
+ - test/integration/project_integration.rb
133
+ - test/integration/harvest_integration_test.rb
134
+ - test/integration/client_teardown.rb
135
+ - test/integration/expense_category_teardown.rb
136
+ - test/integration/project_teardown.rb
137
+ - test/integration/task_teardown.rb