harvested 0.3.3 → 0.4.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.
Files changed (109) hide show
  1. data/Gemfile +15 -0
  2. data/HISTORY +11 -0
  3. data/README.md +14 -6
  4. data/Rakefile +13 -31
  5. data/TODO +2 -0
  6. data/VERSION +1 -1
  7. data/examples/user_assignments.rb +1 -1
  8. data/harvested.gemspec +114 -126
  9. data/lib/ext/array.rb +52 -0
  10. data/lib/ext/date.rb +9 -0
  11. data/lib/ext/hash.rb +17 -0
  12. data/lib/ext/time.rb +5 -0
  13. data/lib/harvest/api/account.rb +8 -1
  14. data/lib/harvest/api/base.rb +32 -10
  15. data/lib/harvest/api/contacts.rb +1 -1
  16. data/lib/harvest/api/expenses.rb +3 -4
  17. data/lib/harvest/api/invoice_categories.rb +26 -0
  18. data/lib/harvest/api/invoices.rb +16 -0
  19. data/lib/harvest/api/projects.rb +2 -10
  20. data/lib/harvest/api/reports.rb +13 -16
  21. data/lib/harvest/api/task_assignments.rb +8 -6
  22. data/lib/harvest/api/tasks.rb +1 -1
  23. data/lib/harvest/api/time.rb +13 -13
  24. data/lib/harvest/api/user_assignments.rb +7 -5
  25. data/lib/harvest/base.rb +9 -1
  26. data/lib/harvest/behavior/activatable.rb +2 -2
  27. data/lib/harvest/behavior/crud.rb +15 -13
  28. data/lib/harvest/client.rb +18 -13
  29. data/lib/harvest/contact.rb +13 -11
  30. data/lib/harvest/errors.rb +6 -4
  31. data/lib/harvest/expense.rb +40 -14
  32. data/lib/harvest/expense_category.rb +10 -9
  33. data/lib/harvest/hardy_client.rb +1 -1
  34. data/lib/harvest/invoice.rb +103 -0
  35. data/lib/harvest/invoice_category.rb +18 -0
  36. data/lib/harvest/line_item.rb +12 -0
  37. data/lib/harvest/model.rb +120 -0
  38. data/lib/harvest/project.rb +55 -26
  39. data/lib/harvest/rate_limit_status.rb +9 -8
  40. data/lib/harvest/task.rb +17 -14
  41. data/lib/harvest/task_assignment.rb +27 -22
  42. data/lib/harvest/time_entry.rb +32 -30
  43. data/lib/harvest/user.rb +46 -22
  44. data/lib/harvest/user_assignment.rb +24 -17
  45. data/lib/harvested.rb +12 -5
  46. data/spec/functional/account_spec.rb +17 -0
  47. data/spec/functional/clients_spec.rb +58 -0
  48. data/spec/functional/errors_spec.rb +22 -0
  49. data/spec/functional/expenses_spec.rb +84 -0
  50. data/spec/functional/hardy_client_spec.rb +33 -0
  51. data/spec/functional/invoice_spec.rb +67 -0
  52. data/spec/functional/project_spec.rb +50 -0
  53. data/spec/functional/reporting_spec.rb +80 -0
  54. data/spec/functional/tasks_spec.rb +88 -0
  55. data/spec/functional/time_tracking_spec.rb +53 -0
  56. data/spec/functional/users_spec.rb +102 -0
  57. data/spec/harvest/base_spec.rb +1 -1
  58. data/spec/harvest/credentials_spec.rb +1 -1
  59. data/spec/harvest/expense_category_spec.rb +5 -0
  60. data/spec/harvest/expense_spec.rb +8 -5
  61. data/spec/harvest/invoice_spec.rb +47 -0
  62. data/spec/harvest/project_spec.rb +11 -0
  63. data/spec/harvest/task_assignment_spec.rb +4 -4
  64. data/spec/harvest/task_spec.rb +7 -0
  65. data/spec/harvest/time_entry_spec.rb +11 -10
  66. data/spec/harvest/user_assignment_spec.rb +3 -3
  67. data/spec/harvest/user_spec.rb +3 -1
  68. data/spec/spec_helper.rb +37 -6
  69. data/{features → spec}/support/harvest_credentials.example.yml +0 -1
  70. data/spec/support/harvested_helpers.rb +44 -0
  71. data/spec/support/json_examples.rb +11 -0
  72. data/spec/test_rubies +5 -0
  73. metadata +109 -85
  74. data/.gitignore +0 -28
  75. data/features/account.feature +0 -7
  76. data/features/client_contacts.feature +0 -23
  77. data/features/clients.feature +0 -29
  78. data/features/errors.feature +0 -25
  79. data/features/expense_categories.feature +0 -21
  80. data/features/expenses.feature +0 -55
  81. data/features/hardy_client.feature +0 -40
  82. data/features/projects.feature +0 -39
  83. data/features/reporting.feature +0 -72
  84. data/features/step_definitions/account_steps.rb +0 -7
  85. data/features/step_definitions/assignment_steps.rb +0 -100
  86. data/features/step_definitions/contact_steps.rb +0 -11
  87. data/features/step_definitions/debug_steps.rb +0 -3
  88. data/features/step_definitions/error_steps.rb +0 -113
  89. data/features/step_definitions/expenses_steps.rb +0 -46
  90. data/features/step_definitions/harvest_steps.rb +0 -8
  91. data/features/step_definitions/model_steps.rb +0 -90
  92. data/features/step_definitions/people_steps.rb +0 -4
  93. data/features/step_definitions/report_steps.rb +0 -91
  94. data/features/step_definitions/time_entry_steps.rb +0 -40
  95. data/features/support/env.rb +0 -37
  96. data/features/support/error_helpers.rb +0 -18
  97. data/features/support/fixtures/empty_clients.xml +0 -2
  98. data/features/support/fixtures/over_limit.xml +0 -8
  99. data/features/support/fixtures/receipt.png +0 -0
  100. data/features/support/fixtures/under_limit.xml +0 -8
  101. data/features/support/harvest_helpers.rb +0 -11
  102. data/features/support/inflections.rb +0 -9
  103. data/features/task_assignment.feature +0 -69
  104. data/features/tasks.feature +0 -25
  105. data/features/time_tracking.feature +0 -29
  106. data/features/user_assignments.feature +0 -33
  107. data/features/users.feature +0 -55
  108. data/lib/harvest/base_model.rb +0 -73
  109. data/spec/spec.default.opts +0 -1
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'harvest tasks' do
4
+ it 'allows adding, updating and removing tasks' do
5
+ cassette('tasks') do
6
+ task = harvest.tasks.create(
7
+ "name" => "A crud task",
8
+ "billable_by_default" => true,
9
+ "default_hourly_rate" => 120
10
+ )
11
+ task.default_hourly_rate.should == "120.0"
12
+
13
+ task.default_hourly_rate = 140
14
+ task = harvest.tasks.update(task)
15
+ task.default_hourly_rate.should == "140.0"
16
+
17
+ harvest.tasks.delete(task)
18
+ harvest.tasks.all.select {|t| t.name == "A crud task"}.should == []
19
+ end
20
+ end
21
+
22
+ context "task assignments" do
23
+ it "allows adding, updating, and removing tasks from projects" do
24
+ cassette('tasks2') do
25
+ client = harvest.clients.create(
26
+ "name" => "Joe's Steam Cleaning",
27
+ "details" => "Building API Widgets across the country"
28
+ )
29
+
30
+ project = harvest.projects.create(
31
+ "name" => "Test Project2",
32
+ "active" => true,
33
+ "notes" => "project to test the api",
34
+ "client_id" => client.id
35
+ )
36
+
37
+ task1 = harvest.tasks.create(
38
+ "name" => "A task for joe",
39
+ "billable_by_default" => true,
40
+ "default_hourly_rate" => 120
41
+ )
42
+
43
+ # need to keep at least one task on the project
44
+ task2 = harvest.tasks.create(
45
+ "name" => "A task for joe2",
46
+ "billable_by_default" => true,
47
+ "default_hourly_rate" => 100
48
+ )
49
+
50
+ harvest.task_assignments.create("project" => project, "task" => task1)
51
+ harvest.task_assignments.create("project" => project, "task" => task2)
52
+
53
+ all_assignments = harvest.task_assignments.all(project)
54
+ assignment1 = all_assignments.detect {|a| a.task_id == task1.id }
55
+ assignment2 = all_assignments.detect {|a| a.task_id == task2.id }
56
+
57
+ assignment1.hourly_rate = 100
58
+ assignment1 = harvest.task_assignments.update(assignment1)
59
+ assignment1.hourly_rate.should == "100.0"
60
+
61
+ harvest.task_assignments.delete(assignment1)
62
+ all_assignments = harvest.task_assignments.all(project)
63
+ all_assignments.size.should == 1
64
+ end
65
+ end
66
+
67
+ it "allows creating and assigning the task at the same time" do
68
+ cassette('tasks3') do
69
+ client = harvest.clients.create(
70
+ "name" => "Joe's Steam Cleaning 2",
71
+ "details" => "Building API Widgets across the country"
72
+ )
73
+
74
+ project = harvest.projects.create(
75
+ "name" => "Test Project3",
76
+ "active" => true,
77
+ "notes" => "project to test the api",
78
+ "client_id" => client.id
79
+ )
80
+
81
+ project2 = harvest.projects.create_task(project, "A simple task")
82
+ project2.should == project
83
+
84
+ harvest.task_assignments.all(project).size.should == 1
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'harvest time tracking' do
4
+ it 'allows adding, updating and removing entries' do
5
+ cassette("time_tracking1") do
6
+ client = harvest.clients.create("name" => "Jane's Car Shop")
7
+ project = harvest.projects.create("name" => "Tracking Project", "client_id" => client.id)
8
+ harvest.projects.create_task(project, "A billable task")
9
+ task = harvest.tasks.all.detect {|t| t.name == "A billable task"}
10
+
11
+ entry = harvest.time.create("notes" => "Test api support", "hours" => 3, "spent_at" => "12/28/2009", "task_id" => task.id, "project_id" => project.id)
12
+ entry.notes.should == "Test api support"
13
+
14
+ entry.notes = "Upgraded to JSON"
15
+ entry = harvest.time.update(entry)
16
+ entry.notes.should == "Upgraded to JSON"
17
+
18
+ harvest.time.delete(entry)
19
+ harvest.time.all(Time.utc(2009, 12, 28)).should == []
20
+ end
21
+ end
22
+
23
+ it 'allows you to save entries for a different user' do
24
+ cassette("time_tracking2") do
25
+ user = harvest.users.create(
26
+ "email" => "frank@example.com",
27
+ "first_name" => "Frank",
28
+ "last_name" => "Doe",
29
+ "password" => "secure"
30
+ )
31
+ client = harvest.clients.create("name" => "Kim's Tux Shop")
32
+ project = harvest.projects.create("name" => "Other User Tracking Project", "client_id" => client.id)
33
+ harvest.user_assignments.create("project" => project, "user" => user)
34
+ harvest.projects.create_task(project, "A billable task for tuxes")
35
+ task = harvest.tasks.all.detect {|t| t.name == "A billable task for tuxes"}
36
+
37
+ entry = harvest.time.create("notes" => "Test api support", "hours" => 3, "spent_at" => "12/28/2009", "task_id" => task.id, "project_id" => project.id, "of_user" => user.id)
38
+ harvest.time.all(Time.utc(2009, 12, 28), user).should == [entry]
39
+
40
+ entry.notes = "Updating notes"
41
+ entry = harvest.time.update(entry, user)
42
+ entry.notes.should == "Updating notes"
43
+
44
+ entry = harvest.time.find(entry, user)
45
+ entry.notes.should == "Updating notes"
46
+
47
+ harvest.time.delete(entry, user)
48
+ harvest.time.all(Time.utc(2009, 12, 28), user).should == []
49
+ end
50
+ end
51
+
52
+ it 'allows toggling of timers'
53
+ end
@@ -0,0 +1,102 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'harvest users' do
4
+ it "allows adding, updating, and removing users" do
5
+ cassette("users") do
6
+ user = harvest.users.create(
7
+ "first_name" => "Edgar",
8
+ "last_name" => "Ruth",
9
+ "email" => "edgar@ruth.com",
10
+ "password" => "mypassword",
11
+ "timezone" => "cst",
12
+ "is_admin" => "false",
13
+ "telephone" => "444-4444"
14
+ )
15
+ user.id.should_not be_blank
16
+
17
+ user.first_name = "Joey"
18
+ user = harvest.users.update(user)
19
+ user.first_name.should == "Joey"
20
+
21
+ id = harvest.users.delete(user)
22
+ harvest.users.all.map(&:id).should_not include(id)
23
+ end
24
+ end
25
+
26
+ it "allows activating and deactivating users" do
27
+ cassette("users2") do
28
+ user = harvest.users.create(
29
+ "first_name" => "John",
30
+ "last_name" => "Ruth",
31
+ "email" => "john@ruth.com",
32
+ "password" => "mypassword",
33
+ "timezone" => "cst",
34
+ "is_admin" => "false",
35
+ "telephone" => "444-4444"
36
+ )
37
+ user.should be_active
38
+
39
+ user = harvest.users.deactivate(user)
40
+ user.should_not be_active
41
+
42
+ user = harvest.users.activate(user)
43
+ user.should be_active
44
+ end
45
+ end
46
+
47
+ it "allows password resets" do
48
+ cassette("users3") do
49
+ user = harvest.users.create(
50
+ "first_name" => "Timmy",
51
+ "last_name" => "Ruth",
52
+ "email" => "timmy@ruth.com",
53
+ "password" => "mypassword",
54
+ "timezone" => "cst",
55
+ "is_admin" => "false",
56
+ "telephone" => "444-4444"
57
+ )
58
+ user.should be_active
59
+
60
+ harvest.users.reset_password(user) # nothing else to assert
61
+ end
62
+ end
63
+
64
+ context "assignments" do
65
+ it "allows adding, updating, and removing users from projects" do
66
+ cassette('users4') do
67
+ client = harvest.clients.create(
68
+ "name" => "Joe's Steam Cleaning w/Users",
69
+ "details" => "Building API Widgets across the country"
70
+ )
71
+
72
+ project = harvest.projects.create(
73
+ "name" => "Test Project w/User",
74
+ "active" => true,
75
+ "notes" => "project to test the api",
76
+ "client_id" => client.id
77
+ )
78
+
79
+ user = harvest.users.create(
80
+ "first_name" => "Sally",
81
+ "last_name" => "Ruth",
82
+ "email" => "sally@ruth.com",
83
+ "password" => "mypassword",
84
+ "timezone" => "cst",
85
+ "is_admin" => "false",
86
+ "telephone" => "444-4444"
87
+ )
88
+
89
+
90
+ assignment = harvest.user_assignments.create("project" => project, "user" => user)
91
+
92
+ assignment.hourly_rate = 100
93
+ assignment = harvest.user_assignments.update(assignment)
94
+ assignment.hourly_rate.should == "100.0"
95
+
96
+ harvest.user_assignments.delete(assignment)
97
+ all_assignments = harvest.user_assignments.all(project)
98
+ all_assignments.size.should == 1
99
+ end
100
+ end
101
+ end
102
+ end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  describe Harvest::Base do
4
4
  describe "username/password errors" do
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  describe Harvest::Credentials do
4
4
  describe "#valid?" do
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Harvest::ExpenseCategory do
4
+ it_behaves_like 'a json sanitizer', %w(cache_version)
5
+ end
@@ -1,15 +1,18 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  describe Harvest::Expense do
4
+ it_behaves_like 'a json sanitizer', %w(has_receipt receipt_url)
5
+
4
6
  describe "#spent_at" do
5
7
  it "should parse strings" do
6
- expense = Harvest::Expense.new(:spent_at => "12/01/2009")
7
- expense.spent_at.should == Time.parse("12/01/2009")
8
+ date = RUBY_VERSION =~ /1.8/ ? "12/01/2009" : "01/12/2009"
9
+ expense = Harvest::Expense.new(:spent_at => date)
10
+ expense.spent_at.should == Time.parse(date)
8
11
  end
9
12
 
10
13
  it "should accept times" do
11
- expense = Harvest::Expense.new(:spent_at => Time.parse("12/01/2009"))
12
- expense.spent_at.should == Time.parse("12/01/2009")
14
+ expense = Harvest::Expense.new(:spent_at => Time.utc(2009, 12, 1))
15
+ expense.spent_at.should == Time.utc(2009, 12, 1)
13
16
  end
14
17
  end
15
18
  end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Harvest::Invoice do
4
+ context 'line_items' do
5
+ it 'parses csv into objects' do
6
+ invoice = Harvest::Invoice.new(:line_items => "kind,description,quantity,unit_price,amount,taxed,taxed2,project_id\nService,Abc,200,12.00,2400.0,false,false,100\nService,def,1.00,20.00,20.0,false,false,101\n")
7
+ invoice.line_items.count.should == 2
8
+ line_item = invoice.line_items.first
9
+
10
+ line_item.kind.should == "Service"
11
+ line_item.project_id.should == "100"
12
+ end
13
+
14
+ it 'parses csv into objects w/o projects' do
15
+ invoice = Harvest::Invoice.new(:line_items => "kind,description,quantity,unit_price,amount,taxed,taxed2,project_id\nService,Abc,200,12.00,2400.0,false,false,\nService,def,1.00,20.00,20.0,false,false,\n")
16
+ invoice.line_items.count.should == 2
17
+ line_item = invoice.line_items.first
18
+
19
+ line_item.kind.should == "Service"
20
+ line_item.description.should == "Abc"
21
+ end
22
+
23
+ it 'parses empty strings' do
24
+ invoice = Harvest::Invoice.new(:line_items => "")
25
+ invoice.line_items.should == []
26
+ end
27
+
28
+ it 'accepts rich objects' do
29
+ Harvest::Invoice.new(:line_items => [Harvest::LineItem.new(:kind => "Service")]).line_items.count.should == 1
30
+ Harvest::Invoice.new(:line_items => Harvest::LineItem.new(:kind => "Service")).line_items.count.should == 1
31
+ end
32
+
33
+ it 'accepts nil' do
34
+ Harvest::Invoice.new(:line_items => nil).line_items.should == []
35
+ end
36
+ end
37
+
38
+ context "as_json" do
39
+ it 'encodes line items csv' do
40
+ invoice = Harvest::Invoice.new(:line_items => "kind,description,quantity,unit_price,amount,taxed,taxed2,project_id\nService,Abc,200,12.00,2400.0,false,false,\nService,def,1.00,20.00,20.0,false,false,\n")
41
+ invoice.line_items.count.should == 2
42
+ invoice.line_items.first.kind.should == "Service"
43
+
44
+ invoice.as_json["doc"]["csv_line_items"].should == "kind,description,quantity,unit_price,amount,taxed,taxed2,project_id\nService,Abc,200,12.00,2400.0,false,false,\nService,def,1.00,20.00,20.0,false,false,\n"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Harvest::Project do
4
+ it_behaves_like 'a json sanitizer', %w(hint_latest_record_at hint_earliest_record_at cache_version)
5
+
6
+ it "cleans up weird attributes" do
7
+ project = Harvest::Project.parse('[{"project":{"hint-earliest-record-at":10, "hint-latest-record-at":20}}]').first
8
+ project.hint_earliest_record_at.should == 10
9
+ project.hint_latest_record_at.should == 20
10
+ end
11
+ end
@@ -1,10 +1,10 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  describe Harvest::TaskAssignment do
4
- describe "#task_xml" do
5
- it "should generate the xml for existing tasks" do
4
+ context "task_as_json" do
5
+ it "generates the json for existing tasks" do
6
6
  assignment = Harvest::TaskAssignment.new(:task => mock(:task, :to_i => 3))
7
- assignment.task_xml.should == '<task><id>3</id></task>'
7
+ assignment.task_as_json.should == {"task" => {"id" => 3}}
8
8
  end
9
9
  end
10
10
  end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Harvest::Task do
4
+ it_behaves_like 'a json sanitizer', %w(cache_version)
5
+
6
+ it 'casts default_hourly_rate to float'
7
+ end
@@ -1,22 +1,23 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  describe Harvest::TimeEntry do
4
- describe "#to_xml" do
5
- it "should build a valid request xml" do
6
- entry = Harvest::TimeEntry.new(:notes => 'the notes', :project_id => 'the project id', :task_id => 'the task id', :hours => 'the hours', :spent_at => '12/28/2009')
7
- entry.to_xml.should == '<request><notes>the notes</notes><hours>the hours</hours><project_id>the project id</project_id><task_id>the task id</task_id><spent_at>Mon Dec 28 00:00:00 -0500 2009</spent_at></request>'
4
+ context '#as_json' do
5
+ it 'builds a specialized hash' do
6
+ entry = Harvest::TimeEntry.new(:notes => 'the notes', :project_id => 'the project id', :task_id => 'the task id', :hours => 'the hours', :spent_at => Time.utc(2009, 12, 28))
7
+ entry.as_json.should == {"notes" => "the notes", "hours" => "the hours", "project_id" => "the project id", "task_id" => "the task id", "spent_at" => "2009-12-28T00:00:00Z"}
8
8
  end
9
9
  end
10
10
 
11
- describe "#spent_at" do
11
+ context "#spent_at" do
12
12
  it "should parse strings" do
13
- entry = Harvest::TimeEntry.new(:spent_at => "12/01/2009")
14
- entry.spent_at.should == Time.parse("12/01/2009")
13
+ date = RUBY_VERSION =~ /1.8/ ? "12/01/2009" : "01/12/2009"
14
+ entry = Harvest::TimeEntry.new(:spent_at => date)
15
+ entry.spent_at.should == Time.parse(date)
15
16
  end
16
17
 
17
18
  it "should accept times" do
18
- entry = Harvest::TimeEntry.new(:spent_at => Time.parse("12/01/2009"))
19
- entry.spent_at.should == Time.parse("12/01/2009")
19
+ entry = Harvest::TimeEntry.new(:spent_at => Time.utc(2009, 12, 1))
20
+ entry.spent_at.should == Time.utc(2009, 12, 1)
20
21
  end
21
22
  end
22
23
  end
@@ -1,10 +1,10 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  describe Harvest::UserAssignment do
4
- describe "#user_xml" do
4
+ describe "#user_as_json" do
5
5
  it "should generate the xml for existing users" do
6
6
  assignment = Harvest::UserAssignment.new(:user => mock(:user, :to_i => 3))
7
- assignment.user_xml.should == '<user><id>3</id></user>'
7
+ assignment.user_as_json.should == {"user" => {"id" => 3}}
8
8
  end
9
9
  end
10
10
  end
@@ -1,6 +1,8 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  describe Harvest::User do
4
+ it_behaves_like 'a json sanitizer', %w(cache_version)
5
+
4
6
  describe "#timezone" do
5
7
  it "should convert friendly timezone setting" do
6
8
  p = Harvest::User.new(:timezone => :cst)
@@ -1,10 +1,41 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
- require "rubygems"
4
1
  require 'harvested'
5
- require 'spec'
6
- require 'spec/autorun'
2
+ require 'webmock/rspec'
3
+ require 'vcr'
7
4
 
8
- Spec::Runner.configure do |config|
5
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require File.expand_path(f) }
6
+
7
+ VCR.config do |c|
8
+ c.cassette_library_dir = '.cassettes'
9
+ c.stub_with :webmock
10
+ end
11
+
12
+ RSpec.configure do |config|
13
+ config.include HarvestedHelpers
14
+
15
+ config.before(:suite) do
16
+ WebMock.allow_net_connect!
17
+ cassette("clean") do
18
+ HarvestedHelpers.clean_remote
19
+ end
20
+ end
21
+
22
+ config.before(:each) do
23
+ WebMock.allow_net_connect!
24
+ end
9
25
 
26
+ def cassette(*args)
27
+ if ENV['CACHE'] == "false"
28
+ if args.last.is_a?(Hash)
29
+ last = args.pop
30
+ last[:record] = :all
31
+ args << last
32
+ else
33
+ args << {:record => :all}
34
+ end
35
+ end
36
+
37
+ VCR.use_cassette(*args) do
38
+ yield
39
+ end
40
+ end
10
41
  end