openproject-meeting 3.0.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 +15 -0
- data/CHANGELOG.md +46 -0
- data/README.md +82 -0
- data/app/assets/images/meeting/agenda.png +0 -0
- data/app/assets/images/meeting/meeting.png +0 -0
- data/app/assets/images/meeting/minutes.png +0 -0
- data/app/assets/stylesheets/meeting/meeting.css.erb +39 -0
- data/app/controllers/meeting_agendas_controller.rb +33 -0
- data/app/controllers/meeting_contents_controller.rb +95 -0
- data/app/controllers/meeting_minutes_controller.rb +22 -0
- data/app/controllers/meetings_controller.rb +150 -0
- data/app/helpers/meeting_contents_helper.rb +68 -0
- data/app/helpers/meetings_helper.rb +16 -0
- data/app/mailers/meeting_mailer.rb +28 -0
- data/app/models/meeting.rb +163 -0
- data/app/models/meeting_agenda.rb +95 -0
- data/app/models/meeting_content.rb +67 -0
- data/app/models/meeting_minutes.rb +81 -0
- data/app/models/meeting_participant.rb +45 -0
- data/app/views/hooks/_activity_index_head.html.erb +13 -0
- data/app/views/meeting_contents/_form.html.erb +33 -0
- data/app/views/meeting_contents/_show.html.erb +40 -0
- data/app/views/meeting_contents/diff.html.erb +33 -0
- data/app/views/meeting_contents/history.html.erb +49 -0
- data/app/views/meeting_contents/show.html.erb +13 -0
- data/app/views/meeting_mailer/content_for_review.html.erb +23 -0
- data/app/views/meeting_mailer/content_for_review.text.erb +9 -0
- data/app/views/meetings/_form.html.erb +61 -0
- data/app/views/meetings/edit.html.erb +17 -0
- data/app/views/meetings/index.html.erb +51 -0
- data/app/views/meetings/new.html.erb +17 -0
- data/app/views/meetings/show.html.erb +48 -0
- data/app/views/shared/_meeting_header.html.erb +3 -0
- data/config/locales/de.yml +47 -0
- data/config/locales/en.yml +47 -0
- data/config/routes.rb +53 -0
- data/db/migrate/20110106210555_create_meetings.rb +29 -0
- data/db/migrate/20110106221214_create_meeting_contents.rb +29 -0
- data/db/migrate/20110106221946_create_meeting_content_versions.rb +20 -0
- data/db/migrate/20110108230721_create_meeting_participants.rb +30 -0
- data/db/migrate/20110224180804_add_lock_to_meeting_content.rb +24 -0
- data/db/migrate/20110819162852_create_initial_meeting_journals.rb +49 -0
- data/db/migrate/20111605171815_merge_meeting_content_versions_with_journals.rb +65 -0
- data/db/migrate/20130731151542_remove_meeting_role_id_from_meeting_participants.rb +20 -0
- data/lib/open_project/meeting.rb +16 -0
- data/lib/open_project/meeting/engine.rb +101 -0
- data/lib/open_project/meeting/hooks.rb +17 -0
- data/lib/open_project/meeting/patches/project_patch.rb +24 -0
- data/lib/open_project/meeting/version.rb +16 -0
- data/lib/openproject-meeting.rb +12 -0
- data/spec/controllers/meetings_controller_spec.rb +90 -0
- data/spec/factories/meeting_agenda_factory.rb +16 -0
- data/spec/factories/meeting_agenda_journal_factory.rb +18 -0
- data/spec/factories/meeting_factory.rb +18 -0
- data/spec/factories/meeting_minutes_factory.rb +16 -0
- data/spec/factories/meeting_minutes_journal_factory.rb +18 -0
- data/spec/factories/meeting_participant_factory.rb +17 -0
- data/spec/mailers/meeting_mailer_spec.rb +101 -0
- data/spec/models/meeting_agenda_journal_spec.rb +21 -0
- data/spec/models/meeting_agenda_spec.rb +52 -0
- data/spec/models/meeting_minutes_journal_spec.rb +21 -0
- data/spec/models/meeting_minutes_spec.rb +44 -0
- data/spec/models/meeting_spec.rb +168 -0
- data/spec/models/user_deletion_spec.rb +186 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/support/plugin_spec_helper.rb +47 -0
- metadata +158 -0
@@ -0,0 +1,101 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
require 'rails/engine'
|
13
|
+
|
14
|
+
module OpenProject::Meeting
|
15
|
+
class Engine < ::Rails::Engine
|
16
|
+
engine_name :openproject_meeting
|
17
|
+
|
18
|
+
config.autoload_paths += Dir["#{config.root}/lib/"]
|
19
|
+
|
20
|
+
spec = Bundler.environment.specs['openproject-meeting'][0]
|
21
|
+
initializer 'meeting.register_plugin' do
|
22
|
+
Redmine::Plugin.register :openproject_meeting do
|
23
|
+
|
24
|
+
name 'OpenProject Meeting'
|
25
|
+
author ((spec.authors.kind_of? Array) ? spec.authors[0] : spec.authors)
|
26
|
+
author_url spec.homepage
|
27
|
+
description spec.description
|
28
|
+
version spec.version
|
29
|
+
url 'https://www.openproject.org/projects/plugin-meetings'
|
30
|
+
|
31
|
+
requires_openproject ">= 3.0.0pre9"
|
32
|
+
|
33
|
+
project_module :meetings do
|
34
|
+
permission :create_meetings, {:meetings => [:new, :create, :copy]}, :require => :member
|
35
|
+
permission :edit_meetings, {:meetings => [:edit, :update]}, :require => :member
|
36
|
+
permission :delete_meetings, {:meetings => [:destroy]}, :require => :member
|
37
|
+
permission :view_meetings, {:meetings => [:index, :show], :meeting_agendas => [:history, :show, :diff], :meeting_minutes => [:history, :show, :diff]}
|
38
|
+
permission :create_meeting_agendas, {:meeting_agendas => [:update, :preview]}, :require => :member
|
39
|
+
permission :close_meeting_agendas, {:meeting_agendas => [:close, :open]}, :require => :member
|
40
|
+
permission :send_meeting_agendas_notification, {:meeting_agendas => [:notify]}, :require => :member
|
41
|
+
permission :create_meeting_minutes, {:meeting_minutes => [:update, :preview]}, :require => :member
|
42
|
+
permission :send_meeting_minutes_notification, {:meeting_minutes => [:notify]}, :require => :member
|
43
|
+
end
|
44
|
+
|
45
|
+
Redmine::Search.map do |search|
|
46
|
+
search.register :meetings
|
47
|
+
end
|
48
|
+
|
49
|
+
menu :project_menu, :meetings, {:controller => '/meetings', :action => 'index'}, :caption => :project_module_meetings, :param => :project_id, :after => :wiki
|
50
|
+
menu :project_menu, :new_meeting, {:controller => '/meetings', :action => 'new'}, :param => :project_id, :caption => :label_meeting_new, :parent => :meetings
|
51
|
+
|
52
|
+
ActiveSupport::Inflector.inflections do |inflect|
|
53
|
+
inflect.uncountable "meeting_minutes"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
initializer 'meeting.precompile_assets' do |app|
|
59
|
+
app.config.assets.precompile += ["meeting.css"]
|
60
|
+
end
|
61
|
+
|
62
|
+
initializer 'meeting.register_path_to_rspec' do |app|
|
63
|
+
app.config.plugins_to_test_paths << self.root
|
64
|
+
end
|
65
|
+
|
66
|
+
config.before_configuration do |app|
|
67
|
+
# This is required for the routes to be loaded first
|
68
|
+
# as the routes should be prepended so they take precedence over the core.
|
69
|
+
app.config.paths['config/routes'].unshift File.join(File.dirname(__FILE__), "..", "..", "..", "config", "routes.rb")
|
70
|
+
end
|
71
|
+
|
72
|
+
initializer "remove_duplicate_meeting_routes", :after => "add_routing_paths" do |app|
|
73
|
+
# removes duplicate entry from app.routes_reloader
|
74
|
+
# As we prepend the plugin's routes to the load_path up front and rails
|
75
|
+
# adds all engines' config/routes.rb later, we have double loaded the routes
|
76
|
+
# This is not harmful as such but leads to duplicate routes which decreases performance
|
77
|
+
app.routes_reloader.paths.uniq!
|
78
|
+
end
|
79
|
+
|
80
|
+
# adds our factories to factory girl's load path
|
81
|
+
initializer "meeting.register_factories", :after => "factory_girl.set_factory_paths" do |app|
|
82
|
+
FactoryGirl.definition_file_paths << File.expand_path(self.root.to_s + '/spec/factories') if defined?(FactoryGirl)
|
83
|
+
end
|
84
|
+
|
85
|
+
initializer "meeting.register_hooks" do
|
86
|
+
require 'open_project/meeting/hooks'
|
87
|
+
end
|
88
|
+
|
89
|
+
config.to_prepare do
|
90
|
+
|
91
|
+
require_dependency 'open_project/meeting/patches/project_patch'
|
92
|
+
|
93
|
+
# load classes so that all User.before_destroy filters are loaded
|
94
|
+
require_dependency 'meeting'
|
95
|
+
require_dependency 'meeting_agenda'
|
96
|
+
require_dependency 'meeting_minutes'
|
97
|
+
require_dependency 'meeting_participant'
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
module OpenProject::Meeting
|
13
|
+
class Hooks < Redmine::Hook::ViewListener
|
14
|
+
render_on :activity_index_head,
|
15
|
+
:partial => 'hooks/activity_index_head'
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
module OpenProject::Meeting
|
13
|
+
module Patches
|
14
|
+
module ProjectPatch
|
15
|
+
def self.included(receiver)
|
16
|
+
receiver.class_eval do
|
17
|
+
has_many :meetings, :include => [:author], :dependent => :destroy
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
Project.send(:include, OpenProject::Meeting::Patches::ProjectPatch)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
module OpenProject
|
13
|
+
module Meeting
|
14
|
+
VERSION = "3.0.0"
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
require 'open_project/meeting'
|
@@ -0,0 +1,90 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
13
|
+
|
14
|
+
describe MeetingsController do
|
15
|
+
before(:each) do
|
16
|
+
@p = mock_model(Project)
|
17
|
+
@controller.stub!(:authorize)
|
18
|
+
@controller.stub!(:check_if_login_required)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "GET" do
|
22
|
+
describe "index" do
|
23
|
+
before(:each) do
|
24
|
+
Project.stub!(:find).and_return(@p)
|
25
|
+
@ms = [mock_model(Meeting), mock_model(Meeting), mock_model(Meeting)]
|
26
|
+
@ms.stub!(:from_tomorrow).and_return(@ms)
|
27
|
+
@p.stub!(:meetings).and_return(@ms)
|
28
|
+
[:with_users_by_date, :page, :per_page].each do |meth|
|
29
|
+
@ms.should_receive(meth).and_return(@ms)
|
30
|
+
end
|
31
|
+
@grouped = double('grouped')
|
32
|
+
Meeting.should_receive(:group_by_time).with(@ms).and_return(@grouped)
|
33
|
+
end
|
34
|
+
describe "html" do
|
35
|
+
before(:each) do
|
36
|
+
get "index", :project_id => @p.id
|
37
|
+
end
|
38
|
+
it {response.should be_success}
|
39
|
+
it {assigns(:meetings_by_start_year_month_date).should eql @grouped }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "show" do
|
44
|
+
before(:each) do
|
45
|
+
@m = mock_model(Meeting)
|
46
|
+
Meeting.stub!(:find).and_return(@m)
|
47
|
+
@m.stub!(:project).and_return(@p)
|
48
|
+
@m.stub!(:agenda).stub!(:present?).and_return(false)
|
49
|
+
end
|
50
|
+
describe "html" do
|
51
|
+
before(:each) do
|
52
|
+
get "show", :id => @m.id
|
53
|
+
end
|
54
|
+
it {response.should be_success}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "new" do
|
59
|
+
before(:each) do
|
60
|
+
Project.stub!(:find).and_return(@p)
|
61
|
+
@m = mock_model(Meeting)
|
62
|
+
@m.stub!(:project=)
|
63
|
+
@m.stub!(:author=)
|
64
|
+
Meeting.stub!(:new).and_return(@m)
|
65
|
+
end
|
66
|
+
describe "html" do
|
67
|
+
before(:each) do
|
68
|
+
get "new", :project_id => @p.id
|
69
|
+
end
|
70
|
+
it {response.should be_success}
|
71
|
+
it {assigns(:meeting).should eql @m}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "edit" do
|
76
|
+
before(:each) do
|
77
|
+
@m = mock_model(Meeting)
|
78
|
+
Meeting.stub!(:find).and_return(@m)
|
79
|
+
@m.stub(:project).and_return(@p)
|
80
|
+
end
|
81
|
+
describe "html" do
|
82
|
+
before(:each) do
|
83
|
+
get "edit", :id => @m.id
|
84
|
+
end
|
85
|
+
it {response.should be_success}
|
86
|
+
it {assigns(:meeting).should eql @m}
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
FactoryGirl.define do
|
13
|
+
factory :meeting_agenda do |a|
|
14
|
+
meeting
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
require 'meeting_agenda'
|
13
|
+
|
14
|
+
FactoryGirl.define do
|
15
|
+
factory :meeting_agenda_journal do |m|
|
16
|
+
m.association :journaled, :factory => :meeting_agenda
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
FactoryGirl.define do
|
13
|
+
factory :meeting do |m|
|
14
|
+
author :factory => :user
|
15
|
+
project
|
16
|
+
m.sequence(:title) { |n| "Meeting #{n}" }
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
FactoryGirl.define do
|
13
|
+
factory :meeting_minutes do |m|
|
14
|
+
meeting
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
require 'meeting_minutes'
|
13
|
+
|
14
|
+
FactoryGirl.define do
|
15
|
+
factory :meeting_minutes_journal do |m|
|
16
|
+
m.association :journaled, :factory => :meeting_minutes
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
FactoryGirl.define do
|
13
|
+
factory :meeting_participant do |mp|
|
14
|
+
user
|
15
|
+
meeting
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
13
|
+
|
14
|
+
describe MeetingMailer do
|
15
|
+
before(:each) do
|
16
|
+
@role = FactoryGirl.create(:role, :permissions => [:view_meetings])
|
17
|
+
@content = FactoryGirl.create(:meeting_agenda)
|
18
|
+
@author = @content.meeting.author
|
19
|
+
@project = @content.meeting.project
|
20
|
+
@watcher1 = FactoryGirl.create(:user)
|
21
|
+
@watcher2 = FactoryGirl.create(:user)
|
22
|
+
@project.add_member @author, [@role]
|
23
|
+
@project.add_member @watcher1, [@role]
|
24
|
+
@project.add_member @watcher2, [@role]
|
25
|
+
|
26
|
+
@participants = [@content.meeting.participants.build(:user => @watcher1, :invited => true, :attended => false),
|
27
|
+
@content.meeting.participants.build(:user => @watcher2, :invited => true, :attended => false)]
|
28
|
+
|
29
|
+
@project.save!
|
30
|
+
@content.meeting.save!
|
31
|
+
|
32
|
+
@content.meeting.watcher_users true
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "content_for_review" do
|
36
|
+
let(:mail) { MeetingMailer.content_for_review @content, 'agenda' }
|
37
|
+
# this is needed to call module functions from Redmine::I18n
|
38
|
+
let(:i18n) do
|
39
|
+
class A
|
40
|
+
include Redmine::I18n
|
41
|
+
public :format_date, :format_time
|
42
|
+
end
|
43
|
+
A.new
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
it "renders the headers" do
|
48
|
+
mail.subject.should include(@content.meeting.project.name)
|
49
|
+
mail.subject.should include(@content.meeting.title)
|
50
|
+
mail.to.should include(@author.mail)
|
51
|
+
mail.from.should eq([Setting.mail_from])
|
52
|
+
mail.cc.should_not include(@author.mail)
|
53
|
+
mail.cc.should include(@watcher1.mail)
|
54
|
+
mail.cc.should include(@watcher2.mail)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "renders the text body" do
|
58
|
+
check_meeting_mail_content mail.text_part.body
|
59
|
+
end
|
60
|
+
|
61
|
+
it "renders the html body" do
|
62
|
+
check_meeting_mail_content mail.html_part.body
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def check_meeting_mail_content(body)
|
67
|
+
body.should include(@content.meeting.project.name)
|
68
|
+
body.should include(@content.meeting.title)
|
69
|
+
body.should include(i18n.format_date @content.meeting.start_date)
|
70
|
+
body.should include(i18n.format_time @content.meeting.start_time, false)
|
71
|
+
body.should include(i18n.format_time @content.meeting.end_time, false)
|
72
|
+
body.should include(@participants[0].name)
|
73
|
+
body.should include(@participants[1].name)
|
74
|
+
end
|
75
|
+
|
76
|
+
def save_and_open_mail_html_body(mail)
|
77
|
+
save_and_open_mail_part mail.html_part.body
|
78
|
+
end
|
79
|
+
|
80
|
+
def save_and_open_mail_text_body(mail)
|
81
|
+
save_and_open_mail_part mail.text_part.body
|
82
|
+
end
|
83
|
+
|
84
|
+
def save_and_open_mail_part(part)
|
85
|
+
FileUtils.mkdir_p(Rails.root.join('tmp/mails'))
|
86
|
+
|
87
|
+
page_path = Rails.root.join("tmp/mails/#{SecureRandom.hex(16)}.html").to_s
|
88
|
+
File.open(page_path, 'w') { |f| f.write(part) }
|
89
|
+
|
90
|
+
Launchy.open(page_path)
|
91
|
+
|
92
|
+
begin
|
93
|
+
binding.pry
|
94
|
+
rescue NoMethodError
|
95
|
+
debugger
|
96
|
+
end
|
97
|
+
|
98
|
+
FileUtils.rm(page_path)
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|