diff options
| author | Kir | 2012-01-28 11:53:22 +0200 |
|---|---|---|
| committer | Kir | 2012-01-28 11:53:22 +0200 |
| commit | 18fcbf4838a3f2835edd526a1bf77f1b846d4e25 (patch) | |
| tree | ce5f9511451d6974fcf2f59e767c64714d73ab25 | |
| parent | 95877d8f982be9a4476cec5943749dcf5db6f524 (diff) | |
| parent | 626ff121111194ec6fa424f36de8658bf72873ba (diff) | |
| download | inboxes-0.2.1.tar.bz2 | |
Merging with rspecv0.2.1
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | .rspec | 1 | ||||
| -rw-r--r-- | Rakefile | 4 | ||||
| -rw-r--r-- | app/controllers/inboxes/discussions_controller.rb | 11 | ||||
| -rw-r--r-- | config/locales/en.yml | 2 | ||||
| -rw-r--r-- | config/locales/ru.yml | 2 | ||||
| -rw-r--r-- | inboxes.gemspec | 12 | ||||
| -rw-r--r-- | lib/inboxes.rb | 3 | ||||
| -rw-r--r-- | spec/devise_config.rb | 210 | ||||
| -rw-r--r-- | spec/fake_app.rb | 97 | ||||
| -rw-r--r-- | spec/fake_gem.rb | 6 | ||||
| -rw-r--r-- | spec/inboxes/discussion_spec.rb | 104 | ||||
| -rw-r--r-- | spec/inboxes/discussions_controller_spec.rb | 96 | ||||
| -rw-r--r-- | spec/inboxes/discussions_routing_spec.rb | 23 | ||||
| -rw-r--r-- | spec/inboxes/message_spec.rb | 27 | ||||
| -rw-r--r-- | spec/inboxes/messages_controller_spec.rb | 42 | ||||
| -rw-r--r-- | spec/inboxes/speaker_spec.rb | 16 | ||||
| -rw-r--r-- | spec/inboxes/speakers_controller_spec.rb | 72 | ||||
| -rw-r--r-- | spec/inboxes_spec.rb | 0 | ||||
| -rw-r--r-- | spec/spec_helper.rb | 29 | ||||
| -rw-r--r-- | spec/support/factories.rb | 23 |
21 files changed, 766 insertions, 17 deletions
@@ -3,4 +3,5 @@ Gemfile.lock pkg/* .DS_Store -.rvmrc
\ No newline at end of file +.rvmrc +log/*
\ No newline at end of file @@ -0,0 +1 @@ +--color @@ -1 +1,5 @@ require "bundler/gem_tasks" +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new(:spec) +task :default => :spec
\ No newline at end of file diff --git a/app/controllers/inboxes/discussions_controller.rb b/app/controllers/inboxes/discussions_controller.rb index 51e2334..8074274 100644 --- a/app/controllers/inboxes/discussions_controller.rb +++ b/app/controllers/inboxes/discussions_controller.rb @@ -5,14 +5,12 @@ class Inboxes::DiscussionsController < Inboxes::BaseController def index @discussions = current_user.discussions end - + def show - # raise current_user.inspect @discussion.mark_as_read_for(current_user) end - + def new - # @discussion = Discussion.new @discussion.messages.build end @@ -32,11 +30,10 @@ class Inboxes::DiscussionsController < Inboxes::BaseController end private - + def load_and_check_discussion_recipient # initializing model for new and create actions @discussion = Discussion.new(params[:discussion].presence || {}) - # @discussion.recipient_tokens = params[:recipients] if params[:recipients] # pre-population # checking if discussion with this user already exists if @discussion.recipient_ids && @discussion.recipient_ids.size == 1 @@ -48,7 +45,7 @@ class Inboxes::DiscussionsController < Inboxes::BaseController Message.create(:discussion => discussion, :user => current_user, :body => message.body) if message.body end # redirecting to that existing object - redirect_to discussion_url(discussion), :notice => t("inboxes.discussions.exists", :user => user[Inboxes::config.user_name]) + redirect_to discussion_url(discussion), :notice => t("inboxes.discussions.already_exists", :user => user[Inboxes::config.user_name]) end end end diff --git a/config/locales/en.yml b/config/locales/en.yml index 348e39b..a9a810d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -10,6 +10,6 @@ en: discussions: started: "Discussion started" leaved: "You leave the discussion" - exists: "Discussion between you and %{user} already exists" + already_exists: "Discussion between you and %{user} already exists" can_not_participate: "You are not listed in this discussion" choose_at_least_one_recipient: "You should choose at least one recipient of discussion"
\ No newline at end of file diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 1258f9f..1e311cd 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -9,7 +9,7 @@ ru: discussions: started: "Чат начат" leaved: "Вы покинули дискуссию" - exists: "Дискуссия между вами и %{user} уже существует" + already_exists: "Дискуссия между вами и %{user} уже существует" can_not_participate: "Вы не состоите в этой дискуссии" choose_at_least_one_recipient: "Укажите хотя бы одного получателя" speakers: diff --git a/inboxes.gemspec b/inboxes.gemspec index 5900502..1b05f38 100644 --- a/inboxes.gemspec +++ b/inboxes.gemspec @@ -21,12 +21,14 @@ Gem::Specification.new do |s| # specify any dependencies here; for example: # s.add_development_dependency "ruby-debug" s.add_runtime_dependency "haml-rails" - s.add_runtime_dependency "cancan", ['>= 0'] - # s.add_runtime_dependency "inherited_resources" + s.add_runtime_dependency "devise" + s.add_runtime_dependency "rails" + s.add_runtime_dependency "cancan" - # s.add_development_dependency 'dm-sqlite-adapter', ['>= 1.1.0'] - # s.add_development_dependency 'rspec', ['>= 0'] - # s.add_development_dependency 'rspec-rails', ['>= 0'] + s.add_development_dependency "sqlite3" + s.add_development_dependency 'rspec', ['>= 0'] + s.add_development_dependency 'factory_girl', ['~> 1.2'] + s.add_development_dependency 'rspec-rails', ['>= 0'] # s.add_development_dependency 'rr', ['>= 0'] # s.add_development_dependency 'steak', ['>= 0'] # s.add_development_dependency 'capybara', ['>= 0'] diff --git a/lib/inboxes.rb b/lib/inboxes.rb index e9ecad7..4e7650d 100644 --- a/lib/inboxes.rb +++ b/lib/inboxes.rb @@ -3,9 +3,9 @@ require "inboxes/version" require "inboxes/railtie" require "inboxes/engine" require "inboxes/active_record_extension" +require "cancan" module Inboxes - def self.configure(&block) yield @config ||= Inboxes::Configuration.new end @@ -30,5 +30,4 @@ module Inboxes # adding method inboxes for models ActiveRecord::Base.extend(Inboxes::ActiveRecordExtension) - end diff --git a/spec/devise_config.rb b/spec/devise_config.rb new file mode 100644 index 0000000..5e86e34 --- /dev/null +++ b/spec/devise_config.rb @@ -0,0 +1,210 @@ +# Use this hook to configure devise mailer, warden hooks and so forth. The first +# four configuration values can also be set straight in your models. +Devise.setup do |config| + # ==> Mailer Configuration + # Configure the e-mail address which will be shown in Devise::Mailer, + # note that it will be overwritten if you use your own mailer class with default "from" parameter. + config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com" + + # Configure the class responsible to send e-mails. + # config.mailer = "Devise::Mailer" + + # ==> ORM configuration + # Load and configure the ORM. Supports :active_record (default) and + # :mongoid (bson_ext recommended) by default. Other ORMs may be + # available as additional gems. + require 'devise/orm/active_record' + + # ==> Configuration for any authentication mechanism + # Configure which keys are used when authenticating a user. The default is + # just :email. You can configure it to use [:username, :subdomain], so for + # authenticating a user, both parameters are required. Remember that those + # parameters are used only when authenticating and not when retrieving from + # session. If you need permissions, you should implement that in a before filter. + # You can also supply a hash where the value is a boolean determining whether + # or not authentication should be aborted when the value is not present. + # config.authentication_keys = [ :email ] + + # Configure parameters from the request object used for authentication. Each entry + # given should be a request method and it will automatically be passed to the + # find_for_authentication method and considered in your model lookup. For instance, + # if you set :request_keys to [:subdomain], :subdomain will be used on authentication. + # The same considerations mentioned for authentication_keys also apply to request_keys. + # config.request_keys = [] + + # Configure which authentication keys should be case-insensitive. + # These keys will be downcased upon creating or modifying a user and when used + # to authenticate or find a user. Default is :email. + config.case_insensitive_keys = [ :email ] + + # Configure which authentication keys should have whitespace stripped. + # These keys will have whitespace before and after removed upon creating or + # modifying a user and when used to authenticate or find a user. Default is :email. + config.strip_whitespace_keys = [ :email ] + + # Tell if authentication through request.params is enabled. True by default. + # config.params_authenticatable = true + + # Tell if authentication through HTTP Basic Auth is enabled. False by default. + # config.http_authenticatable = false + + # If http headers should be returned for AJAX requests. True by default. + # config.http_authenticatable_on_xhr = true + + # The realm used in Http Basic Authentication. "Application" by default. + # config.http_authentication_realm = "Application" + + # It will change confirmation, password recovery and other workflows + # to behave the same regardless if the e-mail provided was right or wrong. + # Does not affect registerable. + # config.paranoid = true + + # ==> Configuration for :database_authenticatable + # For bcrypt, this is the cost for hashing the password and defaults to 10. If + # using other encryptors, it sets how many times you want the password re-encrypted. + # + # Limiting the stretches to just one in testing will increase the performance of + # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use + # a value less than 10 in other environments. + config.stretches = Rails.env.test? ? 1 : 10 + + # Setup a pepper to generate the encrypted password. + # config.pepper = "9a86f39fcb72573a367c4fcde09b1ae3fe81c3c2c5858c6024033360b39a0f46ab72c8aade6453e96dfae546262c0336372c19518600367fc8b94e9bb4d5db15" + + # ==> Configuration for :confirmable + # A period that the user is allowed to access the website even without + # confirming his account. For instance, if set to 2.days, the user will be + # able to access the website for two days without confirming his account, + # access will be blocked just in the third day. Default is 0.days, meaning + # the user cannot access the website without confirming his account. + # config.confirm_within = 2.days + + # Defines which key will be used when confirming an account + # config.confirmation_keys = [ :email ] + + # ==> Configuration for :rememberable + # The time the user will be remembered without asking for credentials again. + # config.remember_for = 2.weeks + + # If true, a valid remember token can be re-used between multiple browsers. + # config.remember_across_browsers = true + + # If true, extends the user's remember period when remembered via cookie. + # config.extend_remember_period = false + + # If true, uses the password salt as remember token. This should be turned + # to false if you are not using database authenticatable. + config.use_salt_as_remember_token = true + + # Options to be passed to the created cookie. For instance, you can set + # :secure => true in order to force SSL only cookies. + # config.cookie_options = {} + + # ==> Configuration for :validatable + # Range for password length. Default is 6..128. + # config.password_length = 6..128 + + # Email regex used to validate email formats. It simply asserts that + # an one (and only one) @ exists in the given string. This is mainly + # to give user feedback and not to assert the e-mail validity. + # config.email_regexp = /\A[^@]+@[^@]+\z/ + + # ==> Configuration for :timeoutable + # The time you want to timeout the user session without activity. After this + # time the user will be asked for credentials again. Default is 30 minutes. + # config.timeout_in = 30.minutes + + # ==> Configuration for :lockable + # Defines which strategy will be used to lock an account. + # :failed_attempts = Locks an account after a number of failed attempts to sign in. + # :none = No lock strategy. You should handle locking by yourself. + # config.lock_strategy = :failed_attempts + + # Defines which key will be used when locking and unlocking an account + # config.unlock_keys = [ :email ] + + # Defines which strategy will be used to unlock an account. + # :email = Sends an unlock link to the user email + # :time = Re-enables login after a certain amount of time (see :unlock_in below) + # :both = Enables both strategies + # :none = No unlock strategy. You should handle unlocking by yourself. + # config.unlock_strategy = :both + + # Number of authentication tries before locking an account if lock_strategy + # is failed attempts. + # config.maximum_attempts = 20 + + # Time interval to unlock the account if :time is enabled as unlock_strategy. + # config.unlock_in = 1.hour + + # ==> Configuration for :recoverable + # + # Defines which key will be used when recovering the password for an account + # config.reset_password_keys = [ :email ] + + # Time interval you can reset your password with a reset password key. + # Don't put a too small interval or your users won't have the time to + # change their passwords. + config.reset_password_within = 2.hours + + # ==> Configuration for :encryptable + # Allow you to use another encryption algorithm besides bcrypt (default). You can use + # :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1, + # :authlogic_sha512 (then you should set stretches above to 20 for default behavior) + # and :restful_authentication_sha1 (then you should set stretches to 10, and copy + # REST_AUTH_SITE_KEY to pepper) + # config.encryptor = :sha512 + + # ==> Configuration for :token_authenticatable + # Defines name of the authentication token params key + # config.token_authentication_key = :auth_token + + # If true, authentication through token does not store user in session and needs + # to be supplied on each request. Useful if you are using the token as API token. + # config.stateless_token = false + + # ==> Scopes configuration + # Turn scoped views on. Before rendering "sessions/new", it will first check for + # "users/sessions/new". It's turned off by default because it's slower if you + # are using only default views. + # config.scoped_views = false + + # Configure the default scope given to Warden. By default it's the first + # devise role declared in your routes (usually :user). + # config.default_scope = :user + + # Configure sign_out behavior. + # Sign_out action can be scoped (i.e. /users/sign_out affects only :user scope). + # The default is true, which means any logout action will sign out all active scopes. + # config.sign_out_all_scopes = true + + # ==> Navigation configuration + # Lists the formats that should be treated as navigational. Formats like + # :html, should redirect to the sign in page when the user does not have + # access, but formats like :xml or :json, should return 401. + # + # If you have any extra navigational formats, like :iphone or :mobile, you + # should add them to the navigational formats lists. + # + # The :"*/*" and "*/*" formats below is required to match Internet + # Explorer requests. + # config.navigational_formats = [:"*/*", "*/*", :html] + + # The default HTTP method used to sign out a resource. Default is :delete. + config.sign_out_via = :delete + + # ==> OmniAuth + # Add a new OmniAuth provider. Check the wiki for more information on setting + # up on your models and hooks. + # config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo' + + # ==> Warden configuration + # If you want to use other strategies, that are not supported by Devise, or + # change the failure app, you can configure them inside the config.warden block. + # + # config.warden do |manager| + # manager.failure_app = AnotherApp + # manager.intercept_401 = false + # manager.default_strategies(:scope => :user).unshift :some_external_strategy + # end +end diff --git a/spec/fake_app.rb b/spec/fake_app.rb new file mode 100644 index 0000000..f7db07f --- /dev/null +++ b/spec/fake_app.rb @@ -0,0 +1,97 @@ +require 'active_record' +require 'action_controller/railtie' +require 'action_view/railtie' + +require "cancan" +require "cancan/ability" +require "cancan/controller_resource" +require "cancan/controller_additions" + +require 'devise' +require 'devise/orm/active_record' + +# database +ActiveRecord::Base.configurations = {'test' => {:adapter => 'sqlite3', :database => ':memory:'}} +ActiveRecord::Base.establish_connection('test') + +# config +app = Class.new(Rails::Application) +app.config.secret_token = "3b7cd727ee24e8444053437c36cc66c4" +app.config.session_store :cookie_store, :key => "_myapp_session" +app.config.active_support.deprecation = :log +app.initialize! + +require 'devise_config' + +# models +class User < ActiveRecord::Base + devise :database_authenticatable, :registerable, + :recoverable, :rememberable, :trackable, :validatable + attr_accessible :email, :password, :password_confirmation, :remember_me, :name + validates :name, :presence => true, :uniqueness => true + has_inboxes +end + +# routes +app.routes.draw do + devise_for :users +end + +#migrations +ActiveRecord::Base.silence do + ActiveRecord::Migration.verbose = false + ActiveRecord::Schema.define :version => 0 do + create_table "users", :force => true do |t| + t.string "email", :default => "", :null => false + t.string "encrypted_password", :limit => 128, :default => "", :null => false + t.string "reset_password_token" + t.datetime "reset_password_sent_at" + t.datetime "remember_created_at" + t.integer "sign_in_count", :default => 0 + t.datetime "current_sign_in_at" + t.datetime "last_sign_in_at" + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.datetime "created_at" + t.datetime "updated_at" + t.string "name" + end + + create_table "discussions", :force => true do |t| + t.integer "user_id" + t.integer "messages_count", :default => 0 + t.boolean "is_private", :default => true + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "messages", :force => true do |t| + t.integer "user_id" + t.integer "discussion_id" + t.text "body" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "speakers", :force => true do |t| + t.integer "user_id" + t.integer "discussion_id" + t.datetime "created_at" + t.datetime "updated_at" + end + end +end + +# controllers +class ApplicationController < ActionController::Base + before_filter :assign_unread_discussions + + private + + def assign_unread_discussions + @unread_discussions_count = Discussion.unread_for(current_user).count if user_signed_in? + end +end + +# helpers +Object.const_set(:ApplicationHelper, Module.new)
\ No newline at end of file diff --git a/spec/fake_gem.rb b/spec/fake_gem.rb new file mode 100644 index 0000000..4435a70 --- /dev/null +++ b/spec/fake_gem.rb @@ -0,0 +1,6 @@ +# Simulate a gem providing a subclass of ActiveRecord::Base before the Railtie is loaded. + +require 'active_record' + +class GemDefinedModel < ActiveRecord::Base +end
\ No newline at end of file diff --git a/spec/inboxes/discussion_spec.rb b/spec/inboxes/discussion_spec.rb new file mode 100644 index 0000000..e74e7b7 --- /dev/null +++ b/spec/inboxes/discussion_spec.rb @@ -0,0 +1,104 @@ +require 'spec_helper' + +describe Discussion do + + it "should create valid group discussion" do + discussion = Discussion.new + discussion.recipient_ids = [Factory(:user), Factory(:user), Factory(:user)].map { |u| u.id } + discussion.save.should be true + + discussion.users.count.should be == 3 + # discussion.private?.should be false + end + + it "should create valid private discussion" do + discussion = Discussion.new + discussion.recipient_ids = [Factory(:user).id, Factory(:user).id] + discussion.save.should be true + discussion.private?.should be true + end + + it "should add messages to valid discussion" do + discussion = Discussion.new + discussion.recipient_ids = [Factory(:user), Factory(:user)].map { |u| u.id } + discussion.save.should be true + + message = Message.new(:user => Factory(:user), :body => Factory.next(:string), :discussion => discussion) + message.save.should be true + end + + it "should not create discussion without repicients" do + discussion = Discussion.new + discussion.save.should be false + end + + it "should not add speakers if discussion is not saved" do + discussion = Discussion.new + lambda { discussion.add_speaker(Factory(:user)) }.should raise_error(ArgumentError) + end + + it "should add speakers to discussion" do + discussion = Factory(:discussion) + user = Factory(:user) + discussion.add_speaker(user) + discussion.users.should include user + end + + it "should remove speaker from discussion" do + discussion = Factory(:discussion) + user = Factory(:user) + discussion.add_speaker(user) + discussion.remove_speaker(user) + + discussion.users.should_not include user + end + + it "should assign discussion as viewed for user" do + user = Factory(:user) + discussion = Factory(:discussion) + discussion.mark_as_read_for(user) + discussion.unread_for?(user).should be false + end + + it "model with new message should be unread for user" do + discussion = Factory(:discussion) + message = Message.create!(:user => Factory(:user), :body => Factory.next(:string), :discussion => discussion) + discussion.unread_for?(Factory(:user)).should be true + end + + it "attribute user_invited_at should be right" do + discussion = Factory(:discussion) + user = Factory(:user) + speaker = discussion.add_speaker(user) + speaker.created_at.to_i.should be == discussion.user_invited_at(user).to_i + end + + it "method exists_between_users? should be right" do + user = Factory(:user) + user2 = Factory(:user) + discussion = Discussion.create!(:recipient_ids => [user.id, user2.id]) + + Discussion.find_between_users(user, user2).should be == discussion + Discussion.find_between_users(user2, user).should be == discussion + end + + it "method exists_between_users? should be right if there is no discussion" do + user = Factory(:user) + user2 = Factory(:user) + + Discussion.find_between_users(user, user2).should be_nil + Discussion.find_between_users(user2, user).should be_nil + end + + it "method exists_between_users? should be right if 2 users are in group discussion" do + user = Factory(:user) + user2 = Factory(:user) + user3 = Factory(:user) + discussion = Discussion.create!(:recipient_ids => [user.id, user2.id, user3.id]) + + Discussion.find_between_users(user, user2).should be_nil + Discussion.find_between_users(user2, user).should be_nil + Discussion.find_between_users(user2, user3).should be_nil + end + +end diff --git a/spec/inboxes/discussions_controller_spec.rb b/spec/inboxes/discussions_controller_spec.rb new file mode 100644 index 0000000..17d1416 --- /dev/null +++ b/spec/inboxes/discussions_controller_spec.rb @@ -0,0 +1,96 @@ +require 'spec_helper' + +describe Inboxes::DiscussionsController do + context "Guest" do + it "should not see discussions list" do + get :index + response.should redirect_to(sign_in_url) + end + + it "should not see new action" do + get :new + response.should redirect_to(sign_in_url) + end + + it "should not create discussion if model is valid" do + recipient_ids = [Factory(:user).id, Factory(:user).id] + post(:create, + :discussion => { + :recipient_ids => recipient_ids, + :messages_attributes => { + 0 => {:body => Factory.next(:string)} + } + } + ) + + response.should redirect_to(sign_in_url) + end + + end + + context("Authenticated admin") do + before(:each) do + @request.env["devise.mapping"] = Devise.mappings[:user] + @user = Factory(:user) + @user.set_role(:admin) + sign_in @user + end + + it "should see discussions list" do + get :index + response.should render_template(:index) + end + + it "should see new action" do + get :new + response.should render_template(:new) + end + + it "should open discussion" do + discussion = Factory.build(:discussion) + discussion.recipient_ids = [@user, Factory(:user)].map { |u| u.id } + discussion.save.should be true + + get(:show, :id => discussion) + response.status.should be 200 + end + + it "should create private discussion if model is valid" do + recipient_ids = [Factory(:user).id, Factory(:user).id] + post(:create, + :discussion => { + :recipient_ids => recipient_ids, + :messages_attributes => { + 0 => {:body => Factory.next(:string)} + } + } + ) + + response.should redirect_to(discussion_url(assigns[:discussion])) + end + + it "should create group discussion if model is valid" do + recipient_ids = [Factory(:user).id, Factory(:user).id, Factory(:user).id] + post(:create, + :discussion => { + :recipient_ids => recipient_ids, + :messages_attributes => { + 0 => {:body => Factory.next(:string)} + } + } + ) + + response.should redirect_to(discussion_url(assigns[:discussion])) + end + + it "should not create discussion with empty message" do + discussion = Discussion.new + discussion.recipient_ids = [Factory(:user).id, Factory(:user).id, Factory(:user).id] + post(:create, :discussion => discussion) + + response.should render_template(:new) + end + + end + +end
\ No newline at end of file diff --git a/spec/inboxes/discussions_routing_spec.rb b/spec/inboxes/discussions_routing_spec.rb new file mode 100644 index 0000000..324cbe3 --- /dev/null +++ b/spec/inboxes/discussions_routing_spec.rb @@ -0,0 +1,23 @@ +require "spec_helper" + +describe Inboxes::DiscussionsController do + describe "routing" do + + it "routes to #index" do + get("/discussions").should route_to("inboxes/discussions#index") + end + + it "routes to #new" do + get("/discussions/new").should route_to("inboxes/discussions#new") + end + + it "routes to #show" do + get("/discussions/1").should route_to("inboxes/discussions#show", :id => "1") + end + + it "routes to #create" do + post("/discussions").should route_to("inboxes/discussions#create") + end + + end +end diff --git a/spec/inboxes/message_spec.rb b/spec/inboxes/message_spec.rb new file mode 100644 index 0000000..c498b04 --- /dev/null +++ b/spec/inboxes/message_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe Message do + it "should not be visible to new speaker" do + discussion = Factory(:discussion) + old_user = Factory(:user) + discussion.add_speaker(old_user) + message = Message.create!(:discussion => discussion, :user => old_user, :body => Factory.next(:string)) + + sleep 2 + + new_user = Factory(:user) + discussion.add_speaker(new_user) + message.visible_for?(new_user).should be_false + end + + it "should be visible to old speaker" do + discussion = Factory(:discussion) + user = Factory(:user) + discussion.add_speaker(user) + message = Message.create!(:discussion => discussion, :user => user, :body => Factory.next(:string)) + + sleep 5 + + message.visible_for?(user).should be_true + end +end diff --git a/spec/inboxes/messages_controller_spec.rb b/spec/inboxes/messages_controller_spec.rb new file mode 100644 index 0000000..0c63070 --- /dev/null +++ b/spec/inboxes/messages_controller_spec.rb @@ -0,0 +1,42 @@ +require 'spec_helper' + +describe Inboxes::MessagesController do + + render_views + + context "Guest" do + it "should redirect guest if he wants to create message" do + discussion = Factory(:discussion) + # puts discussion.id + post :create, :discussion_id => discussion.id + response.should redirect_to(sign_in_url) + end + end + + context "Authenticated admin" do + before(:each) do + @request.env["devise.mapping"] = Devise.mappings[:user] + @admin = Factory(:admin) + @admin.set_role(:admin) + sign_in @admin + end + + it "create action should redirect to discussion when model is valid" do + Message.any_instance.stubs(:valid?).returns(true) + message = Factory(:message) + user = Factory(:user) + discussion = Factory(:discussion, :recipient_ids => [@admin.id, user.id]) + post(:create, :discussion_id => discussion.id) + response.should redirect_to(discussion_url(discussion)) + end + + # it "create action should assign flash with error message" do + # Comment.any_instance.stubs(:valid?).returns(false) + # first_post = Factory(:post) + # post :create, :post_id => first_post + # + # flash[:notice].should =~ /Введите текст комментария!/i + # end + end + +end diff --git a/spec/inboxes/speaker_spec.rb b/spec/inboxes/speaker_spec.rb new file mode 100644 index 0000000..22b4bdc --- /dev/null +++ b/spec/inboxes/speaker_spec.rb @@ -0,0 +1,16 @@ +require 'spec_helper' + +describe Speaker do + # it "should create valid model" do + # speaker = Speaker.new + # speaker.user = Factory(:user) + # speaker.discussion = Factory(:discussion) + # speaker.save.should be true + # end + # + # it "should bot create model without discussion" do + # speaker = Speaker.new + # speaker.user = Factory(:user) + # speaker.save.should be false + # end +end diff --git a/spec/inboxes/speakers_controller_spec.rb b/spec/inboxes/speakers_controller_spec.rb new file mode 100644 index 0000000..ce413d7 --- /dev/null +++ b/spec/inboxes/speakers_controller_spec.rb @@ -0,0 +1,72 @@ +require 'spec_helper' + +describe Inboxes::SpeakersController do + + context("Authenticated admin") do + before(:each) do + @request.env["devise.mapping"] = Devise.mappings[:user] + @user = Factory(:user) + @user.set_role(:admin) + sign_in @user + end + + it "should add speaker to discussion" do + discussion = Factory(:discussion, :recipient_ids => [@user.id, Factory(:user).id]) + post(:create, + :discussion_id => discussion, + :speaker => { + :user_id => Factory(:user).id + } + ) + response.should redirect_to(discussion_url(discussion)) + flash[:notice].should =~ /Собеседник успешно добавлен/i + end + + # it "should not add bad speaker to discussion" do + # discussion = Factory(:discussion) + # + # lambda { + # post(:create, + # :discussion_id => discussion + # ) + # }.should raise_error(ActiveRecord::RecordNotFound) + # end + end + + context("User") do + before(:each) do + @request.env["devise.mapping"] = Devise.mappings[:user] + @user = Factory(:user) + @user.set_role(:user) + sign_in @user + end + + it "should add speaker to discussion if he is participant if this discussion" do + Speaker.any_instance.stubs(:valid?).returns(true) + discussion = Factory(:discussion, :recipient_ids => [@user.id, Factory(:user).id]) + # puts discussion.can_participate?(@user) + # new_user = Factory(:user) + post(:create, + :discussion_id => discussion, + :speaker => { + :user_id => Factory(:user).id + } + ) + response.should redirect_to(discussion_url(discussion)) + # response.should redirect_to(root_url) + flash[:notice].should =~ /Собеседник успешно добавлен/i + end + + # дописать спек + it "should not add speaker to discussion if he is not participant if this discussion" do + discussion = Factory(:discussion) + post(:create, + :discussion_id => discussion, + :speaker => { + :user_id => Factory(:user).id + } + ) + response.should redirect_to(root_url) + end + end +end diff --git a/spec/inboxes_spec.rb b/spec/inboxes_spec.rb new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/spec/inboxes_spec.rb diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..5caa0f5 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,29 @@ +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) +$LOAD_PATH.unshift(File.dirname(__FILE__)) +require 'rails' +require 'active_record' +require 'inboxes' +# require 'database_cleaner' +# Ensure we use 'syck' instead of 'psych' in 1.9.2 +# RubyGems >= 1.5.0 uses 'psych' on 1.9.2, but +# Psych does not yet support YAML 1.1 merge keys. +# Merge keys is often used in mongoid.yml +# See: http://redmine.ruby-lang.org/issues/show/4300 +if RUBY_VERSION >= '1.9.2' + YAML::ENGINE.yamler = 'syck' +end +# require 'fake_gem' +require 'fake_app' + +require 'rspec/rails' +# Requires supporting files with custom matchers and macros, etc, +# in ./support/ and its subdirectories. +Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f} + +# RSpec.configure do |config| +# config.mock_with :rr +# config.before :all do +# # ActiveRecord::Base.connection.execute 'CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255))' unless ActiveRecord::Base.connection.table_exists? 'users' +# # CreateAllTables.up unless ActiveRecord::Base.connection.table_exists? 'users' +# end +# end
\ No newline at end of file diff --git a/spec/support/factories.rb b/spec/support/factories.rb new file mode 100644 index 0000000..9a5bb87 --- /dev/null +++ b/spec/support/factories.rb @@ -0,0 +1,23 @@ +# FactoryGirl.define do +# +# factory :user do +# email {Factory.next(:email)} +# first_name 'user' +# last_name 'usered' +# username {Factory.next(:login)} +# password "foobar" +# password_confirmation { |u| u.password } +# role 2 +# end +# +# factory :discussion do +# recipient_ids {[Factory(:user).id, Factory(:user).id]} +# end +# +# factory :message do +# association :user +# association :discussion +# # user {Factory(:user)} +# # discussion {Factory(:discussion)} +# end +# end
\ No newline at end of file |
