inboxes 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -1
- data/.rspec +1 -0
- data/README.md +16 -8
- data/Rakefile +4 -0
- data/app/controllers/inboxes/base_controller.rb +0 -6
- data/app/controllers/inboxes/discussions_controller.rb +5 -22
- data/app/controllers/inboxes/messages_controller.rb +0 -9
- data/app/controllers/inboxes/speakers_controller.rb +0 -2
- data/app/helpers/inboxes_helper.rb +1 -2
- data/app/models/discussion.rb +0 -2
- data/config/locales/en.yml +1 -1
- data/config/locales/ru.yml +1 -1
- data/inboxes.gemspec +7 -5
- data/lib/inboxes.rb +2 -4
- data/lib/inboxes/engine.rb +0 -7
- data/lib/inboxes/railtie.rb +0 -1
- data/lib/inboxes/version.rb +1 -1
- data/spec/devise_config.rb +210 -0
- data/spec/fake_app.rb +97 -0
- data/spec/fake_gem.rb +6 -0
- data/spec/inboxes/discussion_spec.rb +104 -0
- data/spec/inboxes/discussions_controller_spec.rb +96 -0
- data/spec/inboxes/discussions_routing_spec.rb +23 -0
- data/spec/inboxes/message_spec.rb +27 -0
- data/spec/inboxes/messages_controller_spec.rb +42 -0
- data/spec/inboxes/speaker_spec.rb +16 -0
- data/spec/inboxes/speakers_controller_spec.rb +72 -0
- data/spec/inboxes_spec.rb +0 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/support/factories.rb +23 -0
- metadata +172 -37
- data/app/models/inboxes/ability.rb +0 -38
- data/lib/inboxes/ability.rb +0 -29
data/spec/fake_app.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'action_controller/railtie'
|
3
|
+
require 'action_view/railtie'
|
4
|
+
|
5
|
+
require "cancan"
|
6
|
+
require "cancan/ability"
|
7
|
+
require "cancan/controller_resource"
|
8
|
+
require "cancan/controller_additions"
|
9
|
+
|
10
|
+
require 'devise'
|
11
|
+
require 'devise/orm/active_record'
|
12
|
+
|
13
|
+
# database
|
14
|
+
ActiveRecord::Base.configurations = {'test' => {:adapter => 'sqlite3', :database => ':memory:'}}
|
15
|
+
ActiveRecord::Base.establish_connection('test')
|
16
|
+
|
17
|
+
# config
|
18
|
+
app = Class.new(Rails::Application)
|
19
|
+
app.config.secret_token = "3b7cd727ee24e8444053437c36cc66c4"
|
20
|
+
app.config.session_store :cookie_store, :key => "_myapp_session"
|
21
|
+
app.config.active_support.deprecation = :log
|
22
|
+
app.initialize!
|
23
|
+
|
24
|
+
require 'devise_config'
|
25
|
+
|
26
|
+
# models
|
27
|
+
class User < ActiveRecord::Base
|
28
|
+
devise :database_authenticatable, :registerable,
|
29
|
+
:recoverable, :rememberable, :trackable, :validatable
|
30
|
+
attr_accessible :email, :password, :password_confirmation, :remember_me, :name
|
31
|
+
validates :name, :presence => true, :uniqueness => true
|
32
|
+
has_inboxes
|
33
|
+
end
|
34
|
+
|
35
|
+
# routes
|
36
|
+
app.routes.draw do
|
37
|
+
devise_for :users
|
38
|
+
end
|
39
|
+
|
40
|
+
#migrations
|
41
|
+
ActiveRecord::Base.silence do
|
42
|
+
ActiveRecord::Migration.verbose = false
|
43
|
+
ActiveRecord::Schema.define :version => 0 do
|
44
|
+
create_table "users", :force => true do |t|
|
45
|
+
t.string "email", :default => "", :null => false
|
46
|
+
t.string "encrypted_password", :limit => 128, :default => "", :null => false
|
47
|
+
t.string "reset_password_token"
|
48
|
+
t.datetime "reset_password_sent_at"
|
49
|
+
t.datetime "remember_created_at"
|
50
|
+
t.integer "sign_in_count", :default => 0
|
51
|
+
t.datetime "current_sign_in_at"
|
52
|
+
t.datetime "last_sign_in_at"
|
53
|
+
t.string "current_sign_in_ip"
|
54
|
+
t.string "last_sign_in_ip"
|
55
|
+
t.datetime "created_at"
|
56
|
+
t.datetime "updated_at"
|
57
|
+
t.string "name"
|
58
|
+
end
|
59
|
+
|
60
|
+
create_table "discussions", :force => true do |t|
|
61
|
+
t.integer "user_id"
|
62
|
+
t.integer "messages_count", :default => 0
|
63
|
+
t.boolean "is_private", :default => true
|
64
|
+
t.datetime "created_at"
|
65
|
+
t.datetime "updated_at"
|
66
|
+
end
|
67
|
+
|
68
|
+
create_table "messages", :force => true do |t|
|
69
|
+
t.integer "user_id"
|
70
|
+
t.integer "discussion_id"
|
71
|
+
t.text "body"
|
72
|
+
t.datetime "created_at"
|
73
|
+
t.datetime "updated_at"
|
74
|
+
end
|
75
|
+
|
76
|
+
create_table "speakers", :force => true do |t|
|
77
|
+
t.integer "user_id"
|
78
|
+
t.integer "discussion_id"
|
79
|
+
t.datetime "created_at"
|
80
|
+
t.datetime "updated_at"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# controllers
|
86
|
+
class ApplicationController < ActionController::Base
|
87
|
+
before_filter :assign_unread_discussions
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def assign_unread_discussions
|
92
|
+
@unread_discussions_count = Discussion.unread_for(current_user).count if user_signed_in?
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# helpers
|
97
|
+
Object.const_set(:ApplicationHelper, Module.new)
|
data/spec/fake_gem.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Discussion do
|
4
|
+
|
5
|
+
it "should create valid group discussion" do
|
6
|
+
discussion = Discussion.new
|
7
|
+
discussion.recipient_ids = [Factory(:user), Factory(:user), Factory(:user)].map { |u| u.id }
|
8
|
+
discussion.save.should be true
|
9
|
+
|
10
|
+
discussion.users.count.should be == 3
|
11
|
+
# discussion.private?.should be false
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should create valid private discussion" do
|
15
|
+
discussion = Discussion.new
|
16
|
+
discussion.recipient_ids = [Factory(:user).id, Factory(:user).id]
|
17
|
+
discussion.save.should be true
|
18
|
+
discussion.private?.should be true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should add messages to valid discussion" do
|
22
|
+
discussion = Discussion.new
|
23
|
+
discussion.recipient_ids = [Factory(:user), Factory(:user)].map { |u| u.id }
|
24
|
+
discussion.save.should be true
|
25
|
+
|
26
|
+
message = Message.new(:user => Factory(:user), :body => Factory.next(:string), :discussion => discussion)
|
27
|
+
message.save.should be true
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should not create discussion without repicients" do
|
31
|
+
discussion = Discussion.new
|
32
|
+
discussion.save.should be false
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should not add speakers if discussion is not saved" do
|
36
|
+
discussion = Discussion.new
|
37
|
+
lambda { discussion.add_speaker(Factory(:user)) }.should raise_error(ArgumentError)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should add speakers to discussion" do
|
41
|
+
discussion = Factory(:discussion)
|
42
|
+
user = Factory(:user)
|
43
|
+
discussion.add_speaker(user)
|
44
|
+
discussion.users.should include user
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should remove speaker from discussion" do
|
48
|
+
discussion = Factory(:discussion)
|
49
|
+
user = Factory(:user)
|
50
|
+
discussion.add_speaker(user)
|
51
|
+
discussion.remove_speaker(user)
|
52
|
+
|
53
|
+
discussion.users.should_not include user
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should assign discussion as viewed for user" do
|
57
|
+
user = Factory(:user)
|
58
|
+
discussion = Factory(:discussion)
|
59
|
+
discussion.mark_as_read_for(user)
|
60
|
+
discussion.unread_for?(user).should be false
|
61
|
+
end
|
62
|
+
|
63
|
+
it "model with new message should be unread for user" do
|
64
|
+
discussion = Factory(:discussion)
|
65
|
+
message = Message.create!(:user => Factory(:user), :body => Factory.next(:string), :discussion => discussion)
|
66
|
+
discussion.unread_for?(Factory(:user)).should be true
|
67
|
+
end
|
68
|
+
|
69
|
+
it "attribute user_invited_at should be right" do
|
70
|
+
discussion = Factory(:discussion)
|
71
|
+
user = Factory(:user)
|
72
|
+
speaker = discussion.add_speaker(user)
|
73
|
+
speaker.created_at.to_i.should be == discussion.user_invited_at(user).to_i
|
74
|
+
end
|
75
|
+
|
76
|
+
it "method exists_between_users? should be right" do
|
77
|
+
user = Factory(:user)
|
78
|
+
user2 = Factory(:user)
|
79
|
+
discussion = Discussion.create!(:recipient_ids => [user.id, user2.id])
|
80
|
+
|
81
|
+
Discussion.find_between_users(user, user2).should be == discussion
|
82
|
+
Discussion.find_between_users(user2, user).should be == discussion
|
83
|
+
end
|
84
|
+
|
85
|
+
it "method exists_between_users? should be right if there is no discussion" do
|
86
|
+
user = Factory(:user)
|
87
|
+
user2 = Factory(:user)
|
88
|
+
|
89
|
+
Discussion.find_between_users(user, user2).should be_nil
|
90
|
+
Discussion.find_between_users(user2, user).should be_nil
|
91
|
+
end
|
92
|
+
|
93
|
+
it "method exists_between_users? should be right if 2 users are in group discussion" do
|
94
|
+
user = Factory(:user)
|
95
|
+
user2 = Factory(:user)
|
96
|
+
user3 = Factory(:user)
|
97
|
+
discussion = Discussion.create!(:recipient_ids => [user.id, user2.id, user3.id])
|
98
|
+
|
99
|
+
Discussion.find_between_users(user, user2).should be_nil
|
100
|
+
Discussion.find_between_users(user2, user).should be_nil
|
101
|
+
Discussion.find_between_users(user2, user3).should be_nil
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Inboxes::DiscussionsController do
|
4
|
+
context "Guest" do
|
5
|
+
it "should not see discussions list" do
|
6
|
+
get :index
|
7
|
+
response.should redirect_to(sign_in_url)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should not see new action" do
|
11
|
+
get :new
|
12
|
+
response.should redirect_to(sign_in_url)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should not create discussion if model is valid" do
|
16
|
+
recipient_ids = [Factory(:user).id, Factory(:user).id]
|
17
|
+
post(:create,
|
18
|
+
:discussion => {
|
19
|
+
:recipient_ids => recipient_ids,
|
20
|
+
:messages_attributes => {
|
21
|
+
0 => {:body => Factory.next(:string)}
|
22
|
+
}
|
23
|
+
}
|
24
|
+
)
|
25
|
+
|
26
|
+
response.should redirect_to(sign_in_url)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
context("Authenticated admin") do
|
32
|
+
before(:each) do
|
33
|
+
@request.env["devise.mapping"] = Devise.mappings[:user]
|
34
|
+
@user = Factory(:user)
|
35
|
+
@user.set_role(:admin)
|
36
|
+
sign_in @user
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should see discussions list" do
|
40
|
+
get :index
|
41
|
+
response.should render_template(:index)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should see new action" do
|
45
|
+
get :new
|
46
|
+
response.should render_template(:new)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should open discussion" do
|
50
|
+
discussion = Factory.build(:discussion)
|
51
|
+
discussion.recipient_ids = [@user, Factory(:user)].map { |u| u.id }
|
52
|
+
discussion.save.should be true
|
53
|
+
|
54
|
+
get(:show, :id => discussion)
|
55
|
+
response.status.should be 200
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should create private discussion if model is valid" do
|
59
|
+
recipient_ids = [Factory(:user).id, Factory(:user).id]
|
60
|
+
post(:create,
|
61
|
+
:discussion => {
|
62
|
+
:recipient_ids => recipient_ids,
|
63
|
+
:messages_attributes => {
|
64
|
+
0 => {:body => Factory.next(:string)}
|
65
|
+
}
|
66
|
+
}
|
67
|
+
)
|
68
|
+
|
69
|
+
response.should redirect_to(discussion_url(assigns[:discussion]))
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should create group discussion if model is valid" do
|
73
|
+
recipient_ids = [Factory(:user).id, Factory(:user).id, Factory(:user).id]
|
74
|
+
post(:create,
|
75
|
+
:discussion => {
|
76
|
+
:recipient_ids => recipient_ids,
|
77
|
+
:messages_attributes => {
|
78
|
+
0 => {:body => Factory.next(:string)}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
)
|
82
|
+
|
83
|
+
response.should redirect_to(discussion_url(assigns[:discussion]))
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should not create discussion with empty message" do
|
87
|
+
discussion = Discussion.new
|
88
|
+
discussion.recipient_ids = [Factory(:user).id, Factory(:user).id, Factory(:user).id]
|
89
|
+
post(:create, :discussion => discussion)
|
90
|
+
|
91
|
+
response.should render_template(:new)
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Inboxes::DiscussionsController do
|
4
|
+
describe "routing" do
|
5
|
+
|
6
|
+
it "routes to #index" do
|
7
|
+
get("/discussions").should route_to("inboxes/discussions#index")
|
8
|
+
end
|
9
|
+
|
10
|
+
it "routes to #new" do
|
11
|
+
get("/discussions/new").should route_to("inboxes/discussions#new")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "routes to #show" do
|
15
|
+
get("/discussions/1").should route_to("inboxes/discussions#show", :id => "1")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "routes to #create" do
|
19
|
+
post("/discussions").should route_to("inboxes/discussions#create")
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Message do
|
4
|
+
it "should not be visible to new speaker" do
|
5
|
+
discussion = Factory(:discussion)
|
6
|
+
old_user = Factory(:user)
|
7
|
+
discussion.add_speaker(old_user)
|
8
|
+
message = Message.create!(:discussion => discussion, :user => old_user, :body => Factory.next(:string))
|
9
|
+
|
10
|
+
sleep 2
|
11
|
+
|
12
|
+
new_user = Factory(:user)
|
13
|
+
discussion.add_speaker(new_user)
|
14
|
+
message.visible_for?(new_user).should be_false
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be visible to old speaker" do
|
18
|
+
discussion = Factory(:discussion)
|
19
|
+
user = Factory(:user)
|
20
|
+
discussion.add_speaker(user)
|
21
|
+
message = Message.create!(:discussion => discussion, :user => user, :body => Factory.next(:string))
|
22
|
+
|
23
|
+
sleep 5
|
24
|
+
|
25
|
+
message.visible_for?(user).should be_true
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Inboxes::MessagesController do
|
4
|
+
|
5
|
+
render_views
|
6
|
+
|
7
|
+
context "Guest" do
|
8
|
+
it "should redirect guest if he wants to create message" do
|
9
|
+
discussion = Factory(:discussion)
|
10
|
+
# puts discussion.id
|
11
|
+
post :create, :discussion_id => discussion.id
|
12
|
+
response.should redirect_to(sign_in_url)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "Authenticated admin" do
|
17
|
+
before(:each) do
|
18
|
+
@request.env["devise.mapping"] = Devise.mappings[:user]
|
19
|
+
@admin = Factory(:admin)
|
20
|
+
@admin.set_role(:admin)
|
21
|
+
sign_in @admin
|
22
|
+
end
|
23
|
+
|
24
|
+
it "create action should redirect to discussion when model is valid" do
|
25
|
+
Message.any_instance.stubs(:valid?).returns(true)
|
26
|
+
message = Factory(:message)
|
27
|
+
user = Factory(:user)
|
28
|
+
discussion = Factory(:discussion, :recipient_ids => [@admin.id, user.id])
|
29
|
+
post(:create, :discussion_id => discussion.id)
|
30
|
+
response.should redirect_to(discussion_url(discussion))
|
31
|
+
end
|
32
|
+
|
33
|
+
# it "create action should assign flash with error message" do
|
34
|
+
# Comment.any_instance.stubs(:valid?).returns(false)
|
35
|
+
# first_post = Factory(:post)
|
36
|
+
# post :create, :post_id => first_post
|
37
|
+
#
|
38
|
+
# flash[:notice].should =~ /Введите текст комментария!/i
|
39
|
+
# end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Speaker do
|
4
|
+
# it "should create valid model" do
|
5
|
+
# speaker = Speaker.new
|
6
|
+
# speaker.user = Factory(:user)
|
7
|
+
# speaker.discussion = Factory(:discussion)
|
8
|
+
# speaker.save.should be true
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# it "should bot create model without discussion" do
|
12
|
+
# speaker = Speaker.new
|
13
|
+
# speaker.user = Factory(:user)
|
14
|
+
# speaker.save.should be false
|
15
|
+
# end
|
16
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Inboxes::SpeakersController do
|
4
|
+
|
5
|
+
context("Authenticated admin") do
|
6
|
+
before(:each) do
|
7
|
+
@request.env["devise.mapping"] = Devise.mappings[:user]
|
8
|
+
@user = Factory(:user)
|
9
|
+
@user.set_role(:admin)
|
10
|
+
sign_in @user
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should add speaker to discussion" do
|
14
|
+
discussion = Factory(:discussion, :recipient_ids => [@user.id, Factory(:user).id])
|
15
|
+
post(:create,
|
16
|
+
:discussion_id => discussion,
|
17
|
+
:speaker => {
|
18
|
+
:user_id => Factory(:user).id
|
19
|
+
}
|
20
|
+
)
|
21
|
+
response.should redirect_to(discussion_url(discussion))
|
22
|
+
flash[:notice].should =~ /Собеседник успешно добавлен/i
|
23
|
+
end
|
24
|
+
|
25
|
+
# it "should not add bad speaker to discussion" do
|
26
|
+
# discussion = Factory(:discussion)
|
27
|
+
#
|
28
|
+
# lambda {
|
29
|
+
# post(:create,
|
30
|
+
# :discussion_id => discussion
|
31
|
+
# )
|
32
|
+
# }.should raise_error(ActiveRecord::RecordNotFound)
|
33
|
+
# end
|
34
|
+
end
|
35
|
+
|
36
|
+
context("User") do
|
37
|
+
before(:each) do
|
38
|
+
@request.env["devise.mapping"] = Devise.mappings[:user]
|
39
|
+
@user = Factory(:user)
|
40
|
+
@user.set_role(:user)
|
41
|
+
sign_in @user
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should add speaker to discussion if he is participant if this discussion" do
|
45
|
+
Speaker.any_instance.stubs(:valid?).returns(true)
|
46
|
+
discussion = Factory(:discussion, :recipient_ids => [@user.id, Factory(:user).id])
|
47
|
+
# puts discussion.can_participate?(@user)
|
48
|
+
# new_user = Factory(:user)
|
49
|
+
post(:create,
|
50
|
+
:discussion_id => discussion,
|
51
|
+
:speaker => {
|
52
|
+
:user_id => Factory(:user).id
|
53
|
+
}
|
54
|
+
)
|
55
|
+
response.should redirect_to(discussion_url(discussion))
|
56
|
+
# response.should redirect_to(root_url)
|
57
|
+
flash[:notice].should =~ /Собеседник успешно добавлен/i
|
58
|
+
end
|
59
|
+
|
60
|
+
# дописать спек
|
61
|
+
it "should not add speaker to discussion if he is not participant if this discussion" do
|
62
|
+
discussion = Factory(:discussion)
|
63
|
+
post(:create,
|
64
|
+
:discussion_id => discussion,
|
65
|
+
:speaker => {
|
66
|
+
:user_id => Factory(:user).id
|
67
|
+
}
|
68
|
+
)
|
69
|
+
response.should redirect_to(root_url)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|