timesheet_plugin 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/COPYRIGHT.txt +16 -0
  2. data/CREDITS.txt +21 -0
  3. data/GPL.txt +339 -0
  4. data/README.rdoc +56 -0
  5. data/Rakefile +33 -0
  6. data/VERSION +1 -0
  7. data/app/controllers/timesheet_controller.rb +145 -0
  8. data/app/helpers/timesheet_helper.rb +42 -0
  9. data/app/models/timesheet.rb +277 -0
  10. data/app/views/settings/_timesheet_settings.rhtml +4 -0
  11. data/app/views/timesheet/_by_issue.rhtml +35 -0
  12. data/app/views/timesheet/_form.rhtml +90 -0
  13. data/app/views/timesheet/_issue_time_entries.rhtml +43 -0
  14. data/app/views/timesheet/_time_entry.rhtml +31 -0
  15. data/app/views/timesheet/_timesheet_group.rhtml +21 -0
  16. data/app/views/timesheet/context_menu.html.erb +4 -0
  17. data/app/views/timesheet/index.rhtml +11 -0
  18. data/app/views/timesheet/no_projects.rhtml +5 -0
  19. data/app/views/timesheet/report.rhtml +52 -0
  20. data/app/views/timesheet/timelog.rhtml +5 -0
  21. data/assets/images/toggle-arrow-closed.gif +0 -0
  22. data/assets/images/toggle-arrow-open.gif +0 -0
  23. data/config/locales/ca.yml +9 -0
  24. data/config/locales/cs.yml +7 -0
  25. data/config/locales/da.yml +10 -0
  26. data/config/locales/de.yml +10 -0
  27. data/config/locales/en.yml +10 -0
  28. data/config/locales/es.yml +9 -0
  29. data/config/locales/fr.yml +10 -0
  30. data/config/locales/hu.yml +10 -0
  31. data/config/locales/it.yml +7 -0
  32. data/config/locales/lt.yml +9 -0
  33. data/config/locales/pl.yml +10 -0
  34. data/config/locales/ru.yml +9 -0
  35. data/init.rb +2 -0
  36. data/lang/ca.yml +8 -0
  37. data/lang/cs.yml +6 -0
  38. data/lang/da.yml +9 -0
  39. data/lang/de.yml +9 -0
  40. data/lang/en.yml +9 -0
  41. data/lang/es.yml +8 -0
  42. data/lang/fr.yml +9 -0
  43. data/lang/hu.yml +9 -0
  44. data/lang/it.yml +6 -0
  45. data/lang/lt.yml +8 -0
  46. data/lang/pl.yml +9 -0
  47. data/lang/ru.yml +8 -0
  48. data/lib/tasks/plugin_stat.rake +38 -0
  49. data/lib/timesheet_compatibility.rb +14 -0
  50. data/rails/init.rb +29 -0
  51. data/spec/controllers/timesheet_controller_spec.rb +263 -0
  52. data/spec/models/timesheet_spec.rb +537 -0
  53. data/spec/sanity_spec.rb +7 -0
  54. data/spec/spec_helper.rb +40 -0
  55. metadata +107 -0
@@ -0,0 +1,10 @@
1
+ fr:
2
+ timesheet_title: Feuille de temps
3
+ timesheet_date_from_label: De
4
+ timesheet_date_to_label: A
5
+ timesheet_project_label: Projet
6
+ timesheet_activities_label: Activite
7
+ timesheet_users_label: Utilisateurs
8
+ timesheet_showing_users: 'showing time for: '
9
+ timesheet_permalink: '(Permalink to this timesheet)'
10
+ timesheet_group_by: Group by
@@ -0,0 +1,10 @@
1
+ hu:
2
+ timesheet_title: Időlap
3
+ timesheet_date_from_label: Kezdő dátum
4
+ timesheet_date_to_label: Vég dátum
5
+ timesheet_project_label: Projekt
6
+ timesheet_activities_label: Aktivitás
7
+ timesheet_users_label: Felhasználók
8
+ timesheet_showing_users: 'mutatás ettől a felhasználótól: '
9
+ timesheet_permalink: '(Permalink erre az időlapra)'
10
+ timesheet_group_by: Csoportosítás
@@ -0,0 +1,7 @@
1
+ it:
2
+ timesheet_title: Consuntivo tempi
3
+ timesheet_date_from_label: Da
4
+ timesheet_date_to_label: A
5
+ timesheet_project_label: Progetto
6
+ timesheet_activities_label: Attività
7
+ timesheet_users_label: Utenti
@@ -0,0 +1,9 @@
1
+ lt:
2
+ timesheet_title: Sunaudoto laiko suvestinė lentelė
3
+ timesheet_date_from_label: Pradedant nuo
4
+ timesheet_date_to_label: iki
5
+ timesheet_project_label: Projektas
6
+ timesheet_activities_label: Aktivumas
7
+ timesheet_users_label: Vartotojai
8
+ timesheet_permalink: '(Pastovi nuoroda į šį lentelę)'
9
+ timesheet_group_by: Grupuoti pagal
@@ -0,0 +1,10 @@
1
+ pl:
2
+ timesheet_title: Czas Pracy
3
+ timesheet_date_from_label: Od
4
+ timesheet_date_to_label: Do
5
+ timesheet_project_label: Projekt
6
+ timesheet_activities_label: Aktywności
7
+ timesheet_users_label: Użytkownicy
8
+ timesheet_showing_users: 'czas pracy użytkownika: '
9
+ timesheet_permalink: '(Permalink do tego czasu pracy)'
10
+ timesheet_group_by: Grupuj
@@ -0,0 +1,9 @@
1
+ ru:
2
+ timesheet_title: Сводная таблица затраченного времени
3
+ timesheet_date_from_label: Начиная с
4
+ timesheet_date_to_label: по
5
+ timesheet_project_label: Проект
6
+ timesheet_activities_label: Активность
7
+ timesheet_users_label: Пользователи
8
+ timesheet_permalink: '(Постоянная ссылка на эту таблицу)'
9
+ timesheet_group_by: Группировать по
data/init.rb ADDED
@@ -0,0 +1,2 @@
1
+ require File.dirname(__FILE__) + "/rails/init"
2
+
data/lang/ca.yml ADDED
@@ -0,0 +1,8 @@
1
+ timesheet_title: Full de temps
2
+ timesheet_date_from_label: De
3
+ timesheet_date_to_label: A
4
+ timesheet_project_label: Projecte
5
+ timesheet_activities_label: Activitat
6
+ timesheet_users_label: Usuaris
7
+ timesheet_showing_users: 'mostrant temps per a: '
8
+ timesheet_permalink: "(Enllaç permanent a aquest full de temps)"
data/lang/cs.yml ADDED
@@ -0,0 +1,6 @@
1
+ timesheet_title: Souhrnná tabulka stráveného času
2
+ timesheet_date_from_label: Od
3
+ timesheet_date_to_label: do
4
+ timesheet_project_label: Projekt
5
+ timesheet_activities_label: Aktivita
6
+ timesheet_users_label: Uživatelé
data/lang/da.yml ADDED
@@ -0,0 +1,9 @@
1
+ timesheet_title: Timeseddel
2
+ timesheet_date_from_label: Fra
3
+ timesheet_date_to_label: Til
4
+ timesheet_project_label: Projekt
5
+ timesheet_activities_label: Aktivitet
6
+ timesheet_users_label: Brugere
7
+ timesheet_showing_users: 'viser tidsregistreringer for: '
8
+ timesheet_permalink: '(Permanent link til denne timeseddel)'
9
+ timesheet_group_by: Gruppér efter
data/lang/de.yml ADDED
@@ -0,0 +1,9 @@
1
+ timesheet_title: Stundenzettel
2
+ timesheet_date_from_label: Von
3
+ timesheet_date_to_label: Bis
4
+ timesheet_project_label: Projekt
5
+ timesheet_activities_label: Aktivität
6
+ timesheet_users_label: Benutzer
7
+ timesheet_showing_users: 'zeige Zeit für: '
8
+ timesheet_permalink: '(Permalink zu diesem Stundenzettel)'
9
+ timesheet_group_by: Gruppiere nach
data/lang/en.yml ADDED
@@ -0,0 +1,9 @@
1
+ timesheet_title: Timesheet
2
+ timesheet_date_from_label: From
3
+ timesheet_date_to_label: To
4
+ timesheet_project_label: Project
5
+ timesheet_activities_label: Activity
6
+ timesheet_users_label: Users
7
+ timesheet_showing_users: 'showing time for: '
8
+ timesheet_permalink: '(Permalink to this timesheet)'
9
+ timesheet_group_by: Group by
data/lang/es.yml ADDED
@@ -0,0 +1,8 @@
1
+ timesheet_title: Hoja de tiempos
2
+ timesheet_date_from_label: De
3
+ timesheet_date_to_label: A
4
+ timesheet_project_label: Proyecto
5
+ timesheet_activities_label: Actividad
6
+ timesheet_users_label: Usuarios
7
+ timesheet_showing_users: 'mostrando tiempos para: '
8
+ timesheet_permalink: '(Permalink a esta hoja de tiempos)'
data/lang/fr.yml ADDED
@@ -0,0 +1,9 @@
1
+ timesheet_title: Feuille de temps
2
+ timesheet_date_from_label: De
3
+ timesheet_date_to_label: A
4
+ timesheet_project_label: Projet
5
+ timesheet_activities_label: Activite
6
+ timesheet_users_label: Utilisateurs
7
+ timesheet_showing_users: 'showing time for: '
8
+ timesheet_permalink: '(Permalink to this timesheet)'
9
+ timesheet_group_by: Group by
data/lang/hu.yml ADDED
@@ -0,0 +1,9 @@
1
+ timesheet_title: Időlap
2
+ timesheet_date_from_label: Kezdő dátum
3
+ timesheet_date_to_label: Vég dátum
4
+ timesheet_project_label: Projekt
5
+ timesheet_activities_label: Aktivitás
6
+ timesheet_users_label: Felhasználók
7
+ timesheet_showing_users: 'mutatás ettől a felhasználótól: '
8
+ timesheet_permalink: '(Permalink erre az időlapra)'
9
+ timesheet_group_by: Csoportosítás
data/lang/it.yml ADDED
@@ -0,0 +1,6 @@
1
+ timesheet_title: Consuntivo tempi
2
+ timesheet_date_from_label: Da
3
+ timesheet_date_to_label: A
4
+ timesheet_project_label: Progetto
5
+ timesheet_activities_label: Attività
6
+ timesheet_users_label: Utenti
data/lang/lt.yml ADDED
@@ -0,0 +1,8 @@
1
+ timesheet_title: Sunaudoto laiko suvestinė lentelė
2
+ timesheet_date_from_label: Pradedant nuo
3
+ timesheet_date_to_label: iki
4
+ timesheet_project_label: Projektas
5
+ timesheet_activities_label: Aktivumas
6
+ timesheet_users_label: Vartotojai
7
+ timesheet_permalink: '(Pastovi nuoroda į šį lentelę)'
8
+ timesheet_group_by: Grupuoti pagal
data/lang/pl.yml ADDED
@@ -0,0 +1,9 @@
1
+ timesheet_title: Czas Pracy
2
+ timesheet_date_from_label: Od
3
+ timesheet_date_to_label: Do
4
+ timesheet_project_label: Projekt
5
+ timesheet_activities_label: Aktywności
6
+ timesheet_users_label: Użytkownicy
7
+ timesheet_showing_users: 'czas pracy użytkownika: '
8
+ timesheet_permalink: '(Permalink do tego czasu pracy)'
9
+ timesheet_group_by: Grupuj
data/lang/ru.yml ADDED
@@ -0,0 +1,8 @@
1
+ timesheet_title: Сводная таблица затраченного времени
2
+ timesheet_date_from_label: Начиная с
3
+ timesheet_date_to_label: по
4
+ timesheet_project_label: Проект
5
+ timesheet_activities_label: Активность
6
+ timesheet_users_label: Пользователи
7
+ timesheet_permalink: '(Постоянная ссылка на эту таблицу)'
8
+ timesheet_group_by: Группировать по
@@ -0,0 +1,38 @@
1
+ namespace :spec do
2
+ task :statsetup do
3
+ require 'code_statistics'
4
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models) if File.exist?('spec/models')
5
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views) if File.exist?('spec/views')
6
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers) if File.exist?('spec/controllers')
7
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/helpers) if File.exist?('spec/helpers')
8
+ ::STATS_DIRECTORIES << %w(Library\ specs spec/lib) if File.exist?('spec/lib')
9
+ ::STATS_DIRECTORIES << %w(Routing\ specs spec/routing) if File.exist?('spec/routing')
10
+ ::STATS_DIRECTORIES << %w(Integration\ specs spec/integration) if File.exist?('spec/integration')
11
+ ::CodeStatistics::TEST_TYPES << "Model specs" if File.exist?('spec/models')
12
+ ::CodeStatistics::TEST_TYPES << "View specs" if File.exist?('spec/views')
13
+ ::CodeStatistics::TEST_TYPES << "Controller specs" if File.exist?('spec/controllers')
14
+ ::CodeStatistics::TEST_TYPES << "Helper specs" if File.exist?('spec/helpers')
15
+ ::CodeStatistics::TEST_TYPES << "Library specs" if File.exist?('spec/lib')
16
+ ::CodeStatistics::TEST_TYPES << "Routing specs" if File.exist?('spec/routing')
17
+ ::CodeStatistics::TEST_TYPES << "Integration specs" if File.exist?('spec/integration')
18
+ end
19
+ end
20
+
21
+
22
+ STATS_DIRECTORIES = [
23
+ %w(Controllers app/controllers),
24
+ %w(Helpers app/helpers),
25
+ %w(Models app/models),
26
+ %w(Libraries lib/),
27
+ %w(APIs app/apis),
28
+ %w(Integration\ tests test/integration),
29
+ %w(Functional\ tests test/functional),
30
+ %w(Unit\ tests test/unit)
31
+
32
+ ].collect { |name, dir| [ name, "./#{dir}" ] }.select { |name, dir| File.directory?(dir) }
33
+
34
+ desc "Report code statistics (KLOCs, etc) from the application"
35
+ task :stats do
36
+ require 'code_statistics'
37
+ CodeStatistics.new(*STATS_DIRECTORIES).to_s
38
+ end
@@ -0,0 +1,14 @@
1
+ # Wrappers around the Redmine core API changes between versions
2
+ module TimesheetCompatibility
3
+ class Enumeration
4
+ # Wrapper around Redmine's API since Enumerations changed in r2472
5
+ # This can be removed once 0.9.0 is stable
6
+ def self.activities
7
+ if ::Enumeration.respond_to?(:activities)
8
+ return ::Enumeration.activities
9
+ else
10
+ return ::Enumeration::get_values('ACTI')
11
+ end
12
+ end
13
+ end
14
+ end
data/rails/init.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'redmine'
2
+
3
+ unless Redmine::Plugin.registered_plugins.keys.include?(:timesheet_plugin)
4
+ Redmine::Plugin.register :timesheet_plugin do
5
+ name 'Timesheet Plugin'
6
+ author 'Eric Davis of Little Stream Software'
7
+ description 'This is a Timesheet plugin for Redmine to show timelogs for all projects'
8
+ url 'https://projects.littlestreamsoftware.com/projects/redmine-timesheet'
9
+ author_url 'http://www.littlestreamsoftware.com'
10
+
11
+ version '0.5.0'
12
+ requires_redmine :version_or_higher => '0.8.0'
13
+
14
+ settings :default => {'list_size' => '5', 'precision' => '2'}, :partial => 'settings/timesheet_settings'
15
+
16
+ permission :see_project_timesheets, { }, :require => :member
17
+
18
+ menu(:top_menu,
19
+ :timesheet,
20
+ {:controller => 'timesheet', :action => 'index'},
21
+ :caption => :timesheet_title,
22
+ :if => Proc.new {
23
+ User.current.allowed_to?(:see_project_timesheets, nil, :global => true) ||
24
+ User.current.allowed_to?(:view_time_entries, nil, :global => true) ||
25
+ User.current.admin?
26
+ })
27
+
28
+ end
29
+ end
@@ -0,0 +1,263 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ module TimesheetControllerHelper
4
+ # Sets up the default mocks
5
+ def default_mocks(options = {})
6
+ # User
7
+ @current_user = mock_model(User)
8
+ @current_user.stub!(:admin?).and_return(false)
9
+ @user_project_mock = mock_model(Project)
10
+ @user_project_mock.stub!(:find).and_return([ ])
11
+ @current_user.stub!(:projects).and_return(@user_project_mock)
12
+ stub_current_user
13
+
14
+ # Redmine application controller
15
+ controller.stub!(:check_if_login_required).and_return(true)
16
+ controller.stub!(:set_localization)
17
+
18
+ # Timesheet
19
+ @timesheet = mock_model(Timesheet)
20
+ @timesheet.stub!(:projects).and_return([ ])
21
+ @timesheet.stub!(:projects=)
22
+ @timesheet.stub!(:allowed_projects).and_return(['not empty'])
23
+ @timesheet.stub!(:allowed_projects=)
24
+ @timesheet.stub!(:date_from)
25
+ @timesheet.stub!(:date_from=)
26
+ @timesheet.stub!(:date_to)
27
+ @timesheet.stub!(:date_to=)
28
+ @timesheet.stub!(:activities)
29
+ @timesheet.stub!(:activities=)
30
+ @timesheet.stub!(:users)
31
+ @timesheet.stub!(:users=)
32
+ @timesheet.stub!(:fetch_time_entries)
33
+ @timesheet.stub!(:time_entries).and_return([ ])
34
+ @timesheet.stub!(:sort)
35
+ @timesheet.stub!(:sort=)
36
+ @timesheet.stub!(:period_type=)
37
+ stub_timesheet unless options[:skip_timesheet_stub]
38
+ end
39
+
40
+ # Converts current user to admin
41
+ def mock_admin
42
+ @current_user.stub!(:admin?).and_return(true)
43
+ stub_current_user
44
+ end
45
+
46
+ # Restubs the current user
47
+ def stub_current_user
48
+ User.stub!(:current).and_return(@current_user)
49
+ end
50
+
51
+ # Restubs the new timesheet
52
+ def stub_timesheet
53
+ Timesheet.stub!(:new).and_return(@timesheet)
54
+ end
55
+ end
56
+
57
+ describe 'TimesheetControllerShared', :shared => true do
58
+ it 'should set @timesheet.allowed_projects to the list of current projects the user is a member of' do
59
+ project1 = mock_model(Project)
60
+ project2 = mock_model(Project)
61
+ projects = [project1, project2]
62
+
63
+ # Adjust mocks
64
+ @user_project_mock.should_receive(:find).and_return(projects)
65
+ stub_current_user
66
+ @timesheet.should_receive(:allowed_projects=).with(projects)
67
+ @timesheet.stub!(:allowed_projects).and_return(projects)
68
+ stub_timesheet
69
+
70
+ send_request
71
+ assigns[:timesheet].allowed_projects.should eql(projects)
72
+ end
73
+
74
+ it 'should set @timesheet.allowed_projects to all the projects if the user is an admin' do
75
+ mock_admin
76
+ project1 = mock_model(Project)
77
+ project2 = mock_model(Project)
78
+ projects = [project1, project2]
79
+
80
+ # Adjust mocks
81
+ Project.stub!(:find).with(:all, { :order => "name ASC" }).and_return(projects)
82
+ @timesheet.should_receive(:allowed_projects=).with(projects)
83
+ @timesheet.stub!(:allowed_projects).and_return(projects)
84
+ stub_timesheet
85
+
86
+ send_request
87
+ assigns[:timesheet].allowed_projects.should eql(projects)
88
+ end
89
+
90
+ it 'should get the list size from the settings' do
91
+ settings = { 'list_size' => 10, 'precision' => '2' }
92
+ Setting.should_receive(:plugin_timesheet_plugin).twice.and_return(settings)
93
+
94
+ send_request
95
+ assigns[:list_size].should eql(10)
96
+ end
97
+
98
+ it 'should get the precision from the settings' do
99
+ settings = { 'list_size' => 10, 'precision' => '2' }
100
+ Setting.should_receive(:plugin_timesheet_plugin).twice.and_return(settings)
101
+
102
+ send_request
103
+ assigns[:precision].should eql(2)
104
+ end
105
+
106
+ it 'should create a new @timesheet' do
107
+ Timesheet.should_receive(:new).and_return(@timesheet)
108
+
109
+ send_request
110
+ assigns[:timesheet].should eql(@timesheet)
111
+ end
112
+ end
113
+
114
+
115
+ describe TimesheetController do
116
+ it "should use TimesheetController" do
117
+ controller.should be_an_instance_of(TimesheetController)
118
+ end
119
+
120
+ end
121
+ describe TimesheetController,"#index with GET request" do
122
+ include TimesheetControllerHelper
123
+
124
+ def send_request
125
+ get 'index'
126
+ end
127
+
128
+ before(:each) do
129
+ default_mocks
130
+ end
131
+
132
+ it_should_behave_like "TimesheetControllerShared"
133
+
134
+ it 'should have no timelog entries' do
135
+ get 'index'
136
+ assigns[:timesheet].time_entries.should be_empty
137
+ end
138
+
139
+ it 'should render the index template' do
140
+ get 'index'
141
+ response.should render_template('index')
142
+ end
143
+ end
144
+
145
+ describe TimesheetController,"#index with GET request and a session" do
146
+ include TimesheetControllerHelper
147
+ it 'should read the session data' do
148
+ default_mocks(:skip_timesheet_stub => true)
149
+
150
+ projects = []
151
+ 4.times do |i|
152
+ projects << mock_model(Project, :id => i + 1)
153
+ end
154
+
155
+ controller.stub!(:allowed_projects).and_return(projects)
156
+ session[TimesheetController::SessionKey] = HashWithIndifferentAccess.new(
157
+ :projects => projects.collect(&:id).collect(&:to_s),
158
+ :date_to => '2009-01-01',
159
+ :date_from => '2009-01-01'
160
+ )
161
+
162
+ get :index
163
+ assigns[:timesheet].date_from.should eql('2009-01-01')
164
+ assigns[:timesheet].date_to.should eql('2009-01-01')
165
+ assigns[:timesheet].projects.should eql(projects)
166
+ end
167
+ end
168
+
169
+ describe TimesheetController,"#index with GET request from an Anonymous user" do
170
+ include TimesheetControllerHelper
171
+
172
+ it 'should render the no_projects template' do
173
+ get 'index'
174
+ response.should render_template('no_projects')
175
+ end
176
+
177
+ end
178
+
179
+ describe TimesheetController,"#report with GET request from an Anonymous user" do
180
+ include TimesheetControllerHelper
181
+
182
+ it 'should redirect to the index' do
183
+ get 'report'
184
+ response.should be_redirect
185
+ response.should redirect_to(:action => 'index')
186
+ end
187
+
188
+ end
189
+
190
+ describe TimesheetController,"#report with POST request from an Anonymous user" do
191
+ include TimesheetControllerHelper
192
+
193
+ it 'should redirect to the index' do
194
+ get 'report'
195
+ response.should be_redirect
196
+ response.should redirect_to(:action => 'index')
197
+ end
198
+
199
+ end
200
+
201
+ describe TimesheetController,"#report with POST request" do
202
+ include TimesheetControllerHelper
203
+
204
+ before(:each) do
205
+ default_mocks
206
+ end
207
+
208
+ def send_request
209
+ post_report
210
+ end
211
+
212
+ def post_report(data={ :timesheet => { } })
213
+ post 'report', data
214
+ end
215
+
216
+ it_should_behave_like "TimesheetControllerShared"
217
+
218
+ it 'should only allow the allowed projects into @timesheet.projects' do
219
+ project1 = mock_model(Project, :to_param => '1', :id => 1)
220
+ project2 = mock_model(Project, :to_param => '2', :id => 2)
221
+ projects = [project1, project2]
222
+
223
+ # Adjust mocks
224
+ @user_project_mock.should_receive(:find).and_return(projects)
225
+ stub_current_user
226
+
227
+ @timesheet.should_receive(:allowed_projects=).with(projects)
228
+ @timesheet.should_receive(:allowed_projects).twice.and_return(projects)
229
+ @timesheet.should_receive(:projects=).with([project1])
230
+ stub_timesheet
231
+
232
+ post_report({ :timesheet => { :projects => ['1'] } })
233
+ end
234
+
235
+ it 'should save the session data' do
236
+ post_report({ :timesheet => { :projects => ['1'] } })
237
+ session[TimesheetController::SessionKey].should_not be_nil
238
+ session[TimesheetController::SessionKey].keys.should include('projects')
239
+ session[TimesheetController::SessionKey]['projects'].should eql(['1'])
240
+ end
241
+ end
242
+
243
+ describe TimesheetController,"#report with request with no data" do
244
+ include TimesheetControllerHelper
245
+
246
+ before(:each) do
247
+ default_mocks
248
+ end
249
+
250
+ describe 'should redirect to the index' do
251
+ it 'from a GET request' do
252
+ post 'report', { }
253
+ response.should be_redirect
254
+ response.should redirect_to(:action => 'index')
255
+ end
256
+
257
+ it 'from a POST request' do
258
+ post 'report', { }
259
+ response.should be_redirect
260
+ response.should redirect_to(:action => 'index')
261
+ end
262
+ end
263
+ end