* Updated gemfile
* Added forum post/topic unit tests * Added forum post/topic controller tests
This commit is contained in:
2
Gemfile
2
Gemfile
@@ -8,7 +8,7 @@ group :test do
|
|||||||
gem "simplecov", :require => false
|
gem "simplecov", :require => false
|
||||||
end
|
end
|
||||||
|
|
||||||
gem "rails", "3.0.0"
|
gem "rails", "3.0.3"
|
||||||
gem "pg"
|
gem "pg"
|
||||||
gem "memcache-client", :require => "memcache"
|
gem "memcache-client", :require => "memcache"
|
||||||
gem "imagesize", :require => "image_size"
|
gem "imagesize", :require => "image_size"
|
||||||
|
|||||||
117
Gemfile.lock
117
Gemfile.lock
@@ -1,12 +1,12 @@
|
|||||||
GIT
|
GIT
|
||||||
remote: http://github.com/EmmanuelOga/ffaker.git
|
remote: http://github.com/EmmanuelOga/ffaker.git
|
||||||
revision: cbe849d
|
revision: 3298ebf33319b840f693a1a0ae2613eeb53e7dc4
|
||||||
specs:
|
specs:
|
||||||
ffaker (0.4.0)
|
ffaker (1.0.0)
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
remote: http://github.com/mislav/will_paginate.git
|
remote: http://github.com/mislav/will_paginate.git
|
||||||
revision: b1a5bee
|
revision: b1a5beeec9f56ecbe3594fcdca76d92b6767ce50
|
||||||
branch: rails3
|
branch: rails3
|
||||||
specs:
|
specs:
|
||||||
will_paginate (3.0.pre3)
|
will_paginate (3.0.pre3)
|
||||||
@@ -15,92 +15,93 @@ GEM
|
|||||||
remote: http://gemcutter.org/
|
remote: http://gemcutter.org/
|
||||||
specs:
|
specs:
|
||||||
abstract (1.0.0)
|
abstract (1.0.0)
|
||||||
actionmailer (3.0.0)
|
actionmailer (3.0.3)
|
||||||
actionpack (= 3.0.0)
|
actionpack (= 3.0.3)
|
||||||
mail (~> 2.2.5)
|
mail (~> 2.2.9)
|
||||||
actionpack (3.0.0)
|
actionpack (3.0.3)
|
||||||
activemodel (= 3.0.0)
|
activemodel (= 3.0.3)
|
||||||
activesupport (= 3.0.0)
|
activesupport (= 3.0.3)
|
||||||
builder (~> 2.1.2)
|
builder (~> 2.1.2)
|
||||||
erubis (~> 2.6.6)
|
erubis (~> 2.6.6)
|
||||||
i18n (~> 0.4.1)
|
i18n (~> 0.4)
|
||||||
rack (~> 1.2.1)
|
rack (~> 1.2.1)
|
||||||
rack-mount (~> 0.6.12)
|
rack-mount (~> 0.6.13)
|
||||||
rack-test (~> 0.5.4)
|
rack-test (~> 0.5.6)
|
||||||
tzinfo (~> 0.3.23)
|
tzinfo (~> 0.3.23)
|
||||||
activemodel (3.0.0)
|
activemodel (3.0.3)
|
||||||
activesupport (= 3.0.0)
|
activesupport (= 3.0.3)
|
||||||
builder (~> 2.1.2)
|
builder (~> 2.1.2)
|
||||||
i18n (~> 0.4.1)
|
i18n (~> 0.4)
|
||||||
activerecord (3.0.0)
|
activerecord (3.0.3)
|
||||||
activemodel (= 3.0.0)
|
activemodel (= 3.0.3)
|
||||||
activesupport (= 3.0.0)
|
activesupport (= 3.0.3)
|
||||||
arel (~> 1.0.0)
|
arel (~> 2.0.2)
|
||||||
tzinfo (~> 0.3.23)
|
tzinfo (~> 0.3.23)
|
||||||
activeresource (3.0.0)
|
activeresource (3.0.3)
|
||||||
activemodel (= 3.0.0)
|
activemodel (= 3.0.3)
|
||||||
activesupport (= 3.0.0)
|
activesupport (= 3.0.3)
|
||||||
activesupport (3.0.0)
|
activesupport (3.0.3)
|
||||||
arel (1.0.1)
|
arel (2.0.6)
|
||||||
activesupport (~> 3.0.0)
|
|
||||||
builder (2.1.2)
|
builder (2.1.2)
|
||||||
daemons (1.1.0)
|
daemons (1.1.0)
|
||||||
delayed_job (2.0.3)
|
delayed_job (2.1.2)
|
||||||
|
activesupport (~> 3.0)
|
||||||
daemons
|
daemons
|
||||||
erubis (2.6.6)
|
erubis (2.6.6)
|
||||||
abstract (>= 1.0.0)
|
abstract (>= 1.0.0)
|
||||||
factory_girl (1.3.2)
|
factory_girl (1.3.3)
|
||||||
haml (3.0.22)
|
haml (3.0.25)
|
||||||
i18n (0.4.2)
|
i18n (0.5.0)
|
||||||
imagesize (0.1.1)
|
imagesize (0.1.1)
|
||||||
mail (2.2.9)
|
mail (2.2.14)
|
||||||
activesupport (>= 2.3.6)
|
activesupport (>= 2.3.6)
|
||||||
i18n (~> 0.4.1)
|
i18n (>= 0.4.0)
|
||||||
mime-types (~> 1.16)
|
mime-types (~> 1.16)
|
||||||
treetop (~> 1.4.8)
|
treetop (~> 1.4.8)
|
||||||
mechanize (1.0.0)
|
mechanize (1.0.0)
|
||||||
nokogiri (>= 1.2.1)
|
nokogiri (>= 1.2.1)
|
||||||
memcache-client (1.8.5)
|
memcache-client (1.8.5)
|
||||||
meta_search (0.9.7.2)
|
meta_search (0.9.11)
|
||||||
actionpack (~> 3.0.0)
|
actionpack (~> 3.0.2)
|
||||||
activerecord (~> 3.0.0)
|
activerecord (~> 3.0.2)
|
||||||
activesupport (~> 3.0.0)
|
activesupport (~> 3.0.2)
|
||||||
arel (~> 1.0.1)
|
arel (~> 2.0.2)
|
||||||
mime-types (1.16)
|
mime-types (1.16)
|
||||||
mocha (0.9.9)
|
mocha (0.9.10)
|
||||||
rake
|
rake
|
||||||
nokogiri (1.4.3.1)
|
nokogiri (1.4.4)
|
||||||
pg (0.9.0)
|
pg (0.10.0)
|
||||||
polyglot (0.3.1)
|
polyglot (0.3.1)
|
||||||
rack (1.2.1)
|
rack (1.2.1)
|
||||||
rack-mount (0.6.13)
|
rack-mount (0.6.13)
|
||||||
rack (>= 1.0.0)
|
rack (>= 1.0.0)
|
||||||
rack-test (0.5.6)
|
rack-test (0.5.7)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
rails (3.0.0)
|
rails (3.0.3)
|
||||||
actionmailer (= 3.0.0)
|
actionmailer (= 3.0.3)
|
||||||
actionpack (= 3.0.0)
|
actionpack (= 3.0.3)
|
||||||
activerecord (= 3.0.0)
|
activerecord (= 3.0.3)
|
||||||
activeresource (= 3.0.0)
|
activeresource (= 3.0.3)
|
||||||
activesupport (= 3.0.0)
|
activesupport (= 3.0.3)
|
||||||
bundler (~> 1.0.0)
|
bundler (~> 1.0)
|
||||||
railties (= 3.0.0)
|
railties (= 3.0.3)
|
||||||
railties (3.0.0)
|
railties (3.0.3)
|
||||||
actionpack (= 3.0.0)
|
actionpack (= 3.0.3)
|
||||||
activesupport (= 3.0.0)
|
activesupport (= 3.0.3)
|
||||||
rake (>= 0.8.4)
|
rake (>= 0.8.7)
|
||||||
thor (~> 0.14.0)
|
thor (~> 0.14.4)
|
||||||
rake (0.8.7)
|
rake (0.8.7)
|
||||||
shoulda (2.11.3)
|
shoulda (2.11.3)
|
||||||
simple_form (1.2.2)
|
simple_form (1.3.0)
|
||||||
simplecov (0.3.7)
|
rails (~> 3.0.0)
|
||||||
|
simplecov (0.3.9)
|
||||||
simplecov-html (>= 0.3.7)
|
simplecov-html (>= 0.3.7)
|
||||||
simplecov-html (0.3.9)
|
simplecov-html (0.3.9)
|
||||||
super_exception_notifier (3.0.13)
|
super_exception_notifier (3.0.13)
|
||||||
actionmailer
|
actionmailer
|
||||||
rake
|
rake
|
||||||
thor (0.14.3)
|
thor (0.14.6)
|
||||||
treetop (1.4.8)
|
treetop (1.4.9)
|
||||||
polyglot (>= 0.3.1)
|
polyglot (>= 0.3.1)
|
||||||
tzinfo (0.3.23)
|
tzinfo (0.3.23)
|
||||||
|
|
||||||
@@ -119,7 +120,7 @@ DEPENDENCIES
|
|||||||
mocha
|
mocha
|
||||||
nokogiri
|
nokogiri
|
||||||
pg
|
pg
|
||||||
rails (= 3.0.0)
|
rails (= 3.0.3)
|
||||||
shoulda
|
shoulda
|
||||||
simple_form
|
simple_form
|
||||||
simplecov
|
simplecov
|
||||||
|
|||||||
@@ -1,42 +1,53 @@
|
|||||||
class ForumTopicsController < ApplicationController
|
class ForumTopicsController < ApplicationController
|
||||||
|
respond_to :html, :xml, :json
|
||||||
|
before_filter :member_only, :except => [:index, :show]
|
||||||
|
rescue_from User::PrivilegeError, :with => "static/access_denied"
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@forum_topic = ForumTopic.new
|
@forum_topic = ForumTopic.new
|
||||||
|
respond_with(@forum_topic)
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
@forum_topic = ForumTopic.find(params[:id])
|
@forum_topic = ForumTopic.find(params[:id])
|
||||||
|
check_privilege(@forum_topic)
|
||||||
|
respond_with(@forum_topic)
|
||||||
end
|
end
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@search = ForumTopic.search(params[:search])
|
@search = ForumTopic.search(params[:search])
|
||||||
@forum_topics = @search.paginate(:page => params[:page], :order => "updated_at DESC")
|
@forum_topics = @search.paginate(:page => params[:page], :order => "updated_at DESC")
|
||||||
|
respond_with(@forum_topics)
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@forum_topic = ForumTopic.find(params[:id])
|
@forum_topic = ForumTopic.find(params[:id])
|
||||||
|
respond_with(@forum_topic)
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@forum_topic = ForumTopic.new(params[:forum_topic])
|
@forum_topic = ForumTopic.create(params[:forum_topic])
|
||||||
if @forum_topic.save
|
respond_with(@forum_topic)
|
||||||
redirect_to forum_topic_path(@forum_topic)
|
|
||||||
else
|
|
||||||
render :action => "new"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@forum_topic = ForumTopic.find(params[:id])
|
@forum_topic = ForumTopic.find(params[:id])
|
||||||
if @forum_topic.update_attributes(params[:forum_topic])
|
check_privilege(@forum_topic)
|
||||||
redirect_to forum_topic_path(@forum_topic)
|
@forum_topic.update_attributes(params[:forum_topic])
|
||||||
else
|
respond_with(@forum_topic)
|
||||||
render :action => "edit"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
@forum_topic = ForumTopic.find(params[:id])
|
@forum_topic = ForumTopic.find(params[:id])
|
||||||
|
check_privilege(@forum_topic)
|
||||||
@forum_topic.destroy
|
@forum_topic.destroy
|
||||||
redirect_to forum_topics_path
|
respond_with(@forum_topic)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def check_privilege(forum_topic)
|
||||||
|
if !forum_topic.editable_by?(CurrentUser.user)
|
||||||
|
raise User::PrivilegeError
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,11 +2,22 @@ class ForumPost < ActiveRecord::Base
|
|||||||
attr_accessible :body, :topic_id
|
attr_accessible :body, :topic_id
|
||||||
belongs_to :creator, :class_name => "User"
|
belongs_to :creator, :class_name => "User"
|
||||||
belongs_to :topic, :class_name => "ForumTopic"
|
belongs_to :topic, :class_name => "ForumTopic"
|
||||||
|
before_validation :initialize_creator, :on => :create
|
||||||
|
before_validation :initialize_updater
|
||||||
after_save :update_topic_updated_at
|
after_save :update_topic_updated_at
|
||||||
validates_presence_of :body, :topic_id, :creator_id
|
validates_presence_of :body, :creator_id
|
||||||
scope :search_body, lambda {|body| where(["text_index @@ plainto_tsquery(?)", body])}
|
scope :body_matches, lambda {|body| where(["text_index @@ plainto_tsquery(?)", body])}
|
||||||
|
search_methods :body_matches
|
||||||
|
|
||||||
def update_topic_updated_at
|
def update_topic_updated_at
|
||||||
topic.touch
|
topic.update_attributes(:updater_id => CurrentUser.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize_creator
|
||||||
|
self.creator_id = CurrentUser.id
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize_updater
|
||||||
|
self.updater_id = CurrentUser.id
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,8 +1,25 @@
|
|||||||
class ForumTopic < ActiveRecord::Base
|
class ForumTopic < ActiveRecord::Base
|
||||||
attr_accessible :title
|
attr_accessible :title, :original_post_attributes
|
||||||
belongs_to :creator, :class_name => "User"
|
belongs_to :creator, :class_name => "User"
|
||||||
has_many :posts, :class_name => "ForumPost", :order => "forum_posts.id asc"
|
belongs_to :updater, :class_name => "User"
|
||||||
|
has_many :posts, :class_name => "ForumPost", :order => "forum_posts.id asc", :foreign_key => "topic_id"
|
||||||
|
has_one :original_post, :class_name => "ForumPost", :order => "forum_posts.id asc", :foreign_key => "topic_id"
|
||||||
|
before_validation :initialize_creator, :on => :create
|
||||||
|
before_validation :initialize_updater
|
||||||
validates_presence_of :title, :creator_id
|
validates_presence_of :title, :creator_id
|
||||||
scope :search_title, lambda {|title| where(["text_index @@ plainto_tsquery(?)", title])}
|
scope :title_matches, lambda {|title| where(["text_index @@ plainto_tsquery(?)", title])}
|
||||||
accepts_nested_attributes_for :posts
|
search_methods :title_matches
|
||||||
|
accepts_nested_attributes_for :original_post
|
||||||
|
|
||||||
|
def editable_by?(user)
|
||||||
|
creator_id == user.id || user.is_moderator?
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize_creator
|
||||||
|
self.creator_id = CurrentUser.id
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize_updater
|
||||||
|
self.updater_id = CurrentUser.id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
7
app/views/forum_topics/_search.html.erb
Normal file
7
app/views/forum_topics/_search.html.erb
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<div>
|
||||||
|
<%= simple_form_for @search do |f| %>
|
||||||
|
<%= f.input :title_matches %>
|
||||||
|
<%= f.input :creator_name_equals %>
|
||||||
|
<%= f.button :submit %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
12
app/views/forum_topics/edit.html.erb
Normal file
12
app/views/forum_topics/edit.html.erb
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<h1>Edit Topic</h1>
|
||||||
|
|
||||||
|
<%= simple_form_for(@forum_topic) do |f| %>
|
||||||
|
<%= f.input :title %>
|
||||||
|
|
||||||
|
<%= f.simple_fields_for :original_post do |pf| %>
|
||||||
|
<%= text_field_tag "forum_topic[original_post_attributes][topic_id]", @forum_topic.id %>
|
||||||
|
<%= pf.input :body %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= f.button :submit %>
|
||||||
|
<% end %>
|
||||||
24
app/views/forum_topics/index.html.erb
Normal file
24
app/views/forum_topics/index.html.erb
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<h1>Forum</h1>
|
||||||
|
|
||||||
|
<%= render "search" %>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Creator</th>
|
||||||
|
<th>Title</th>
|
||||||
|
<th>Updated by</th>
|
||||||
|
<th>Updated at</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% @forum_topics.each do |topic| %>
|
||||||
|
<tr>
|
||||||
|
<td><%= topic.creator.name %></td>
|
||||||
|
<td><%= topic.title %></td>
|
||||||
|
<td><%= topic.updater.name %></td>
|
||||||
|
<td><%= compact_time topic.updated_at %></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
11
app/views/forum_topics/new.html.erb
Normal file
11
app/views/forum_topics/new.html.erb
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<h1>New Topic</h1>
|
||||||
|
|
||||||
|
<%= simple_form_for(@forum_topic) do |f| %>
|
||||||
|
<%= f.input :title %>
|
||||||
|
|
||||||
|
<%= f.simple_fields_for :original_post do |pf| %>
|
||||||
|
<%= pf.input :body %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= f.button :submit %>
|
||||||
|
<% end %>
|
||||||
@@ -400,7 +400,6 @@ CREATE TABLE dmails (
|
|||||||
owner_id integer NOT NULL,
|
owner_id integer NOT NULL,
|
||||||
from_id integer NOT NULL,
|
from_id integer NOT NULL,
|
||||||
to_id integer NOT NULL,
|
to_id integer NOT NULL,
|
||||||
parent_id integer,
|
|
||||||
title character varying(255) NOT NULL,
|
title character varying(255) NOT NULL,
|
||||||
body text NOT NULL,
|
body text NOT NULL,
|
||||||
message_index tsvector NOT NULL,
|
message_index tsvector NOT NULL,
|
||||||
@@ -738,6 +737,7 @@ CREATE TABLE forum_posts (
|
|||||||
id integer NOT NULL,
|
id integer NOT NULL,
|
||||||
topic_id integer NOT NULL,
|
topic_id integer NOT NULL,
|
||||||
creator_id integer NOT NULL,
|
creator_id integer NOT NULL,
|
||||||
|
updater_id integer NOT NULL,
|
||||||
body text NOT NULL,
|
body text NOT NULL,
|
||||||
text_index tsvector NOT NULL,
|
text_index tsvector NOT NULL,
|
||||||
created_at timestamp without time zone,
|
created_at timestamp without time zone,
|
||||||
@@ -771,6 +771,7 @@ ALTER SEQUENCE forum_posts_id_seq OWNED BY forum_posts.id;
|
|||||||
CREATE TABLE forum_topics (
|
CREATE TABLE forum_topics (
|
||||||
id integer NOT NULL,
|
id integer NOT NULL,
|
||||||
creator_id integer NOT NULL,
|
creator_id integer NOT NULL,
|
||||||
|
updater_id integer NOT NULL,
|
||||||
title character varying(255) NOT NULL,
|
title character varying(255) NOT NULL,
|
||||||
response_count integer DEFAULT 0 NOT NULL,
|
response_count integer DEFAULT 0 NOT NULL,
|
||||||
is_sticky boolean DEFAULT false NOT NULL,
|
is_sticky boolean DEFAULT false NOT NULL,
|
||||||
@@ -2386,13 +2387,6 @@ CREATE INDEX index_dmails_on_message_index ON dmails USING gin (message_index);
|
|||||||
CREATE INDEX index_dmails_on_owner_id ON dmails USING btree (owner_id);
|
CREATE INDEX index_dmails_on_owner_id ON dmails USING btree (owner_id);
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: index_dmails_on_parent_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX index_dmails_on_parent_id ON dmails USING btree (parent_id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: index_favorites_0_on_post_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
-- Name: index_favorites_0_on_post_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
||||||
--
|
--
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ class CreateForumTopics < ActiveRecord::Migration
|
|||||||
def self.up
|
def self.up
|
||||||
create_table :forum_topics do |t|
|
create_table :forum_topics do |t|
|
||||||
t.column :creator_id, :integer, :null => false
|
t.column :creator_id, :integer, :null => false
|
||||||
|
t.column :updater_id, :integer, :null => false
|
||||||
t.column :title, :string, :null => false
|
t.column :title, :string, :null => false
|
||||||
t.column :response_count, :integer, :null => false, :default => 0
|
t.column :response_count, :integer, :null => false, :default => 0
|
||||||
t.column :is_sticky, :boolean, :null => false, :default => false
|
t.column :is_sticky, :boolean, :null => false, :default => false
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ class CreateForumPosts < ActiveRecord::Migration
|
|||||||
create_table :forum_posts do |t|
|
create_table :forum_posts do |t|
|
||||||
t.column :topic_id, :integer, :null => false
|
t.column :topic_id, :integer, :null => false
|
||||||
t.column :creator_id, :integer, :null => false
|
t.column :creator_id, :integer, :null => false
|
||||||
|
t.column :updater_id, :integer, :null => false
|
||||||
t.column :body, :text, :null => false
|
t.column :body, :text, :null => false
|
||||||
t.column :text_index, "tsvector", :null => false
|
t.column :text_index, "tsvector", :null => false
|
||||||
t.timestamps
|
t.timestamps
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
Factory.define(:forum_post) do |f|
|
Factory.define(:forum_post) do |f|
|
||||||
f.creator {|x| x.association(:user)}
|
|
||||||
f.body {Faker::Lorem.sentences}
|
f.body {Faker::Lorem.sentences}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
Factory.define(:forum_topic) do |f|
|
Factory.define(:forum_topic) do |f|
|
||||||
f.creator {|x| x.association(:user)}
|
|
||||||
f.title {Faker::Lorem.words}
|
f.title {Faker::Lorem.words}
|
||||||
f.is_sticky false
|
f.is_sticky false
|
||||||
f.is_locked false
|
f.is_locked false
|
||||||
|
|||||||
@@ -1,8 +1,80 @@
|
|||||||
require 'test_helper'
|
require 'test_helper'
|
||||||
|
|
||||||
class ForumTopicsControllerTest < ActionController::TestCase
|
class ForumTopicsControllerTest < ActionController::TestCase
|
||||||
# Replace this with your real tests.
|
context "The forum topics controller" do
|
||||||
test "the truth" do
|
setup do
|
||||||
assert true
|
@user = Factory.create(:user)
|
||||||
|
CurrentUser.user = @user
|
||||||
|
CurrentUser.ip_addr = "127.0.0.1"
|
||||||
|
@other_user = Factory.create(:user)
|
||||||
|
@mod = Factory.create(:moderator_user)
|
||||||
|
@forum_topic = Factory.create(:forum_topic, :title => "my forum topic", :creator => @user)
|
||||||
|
end
|
||||||
|
|
||||||
|
teardown do
|
||||||
|
CurrentUser.user = nil
|
||||||
|
CurrentUser.ip_addr = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
context "index action" do
|
||||||
|
should "list all forum topics" do
|
||||||
|
get :index
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with search conditions" do
|
||||||
|
should "list all matching forum topics" do
|
||||||
|
get :index, {:search => {:title_matches => "forum"}}
|
||||||
|
assert_response :success
|
||||||
|
assert_equal(1, assigns(:forum_topics).size)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "list nothing for when the search matches nothing" do
|
||||||
|
get :index, {:search => {:title_matches => "bababa"}}
|
||||||
|
assert_response :success
|
||||||
|
assert_equal(0, assigns(:forum_topics).size)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "edit action" do
|
||||||
|
should "render if the editor is the creator of the topic" do
|
||||||
|
get :edit, {:id => @forum_topic.id}, {:user_id => @user.id}
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
|
||||||
|
should "render if the editor is a moderator" do
|
||||||
|
get :edit, {:id => @forum_topic.id}, {:user_id => @mod.id}
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
|
||||||
|
should "fail if the editor is not the creator of the topic and is not a moderator" do
|
||||||
|
assert_raises(User::PrivilegeError) do
|
||||||
|
get :edit, {:id => @forum_topic.id}, {:user_id => @other_user.id}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "new action" do
|
||||||
|
should "render" do
|
||||||
|
get :new, {}, {:user_id => @user.id}
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "create action" do
|
||||||
|
should "create a new forum topic and post" do
|
||||||
|
assert_difference(["ForumPost.count", "ForumTopic.count"], 1) do
|
||||||
|
post :create, {:forum_topic => {:title => "bababa", :original_post_attributes => {:body => "xaxaxa"}}}, {:user_id => @user.id}
|
||||||
|
end
|
||||||
|
|
||||||
|
forum_topic = ForumTopic.last
|
||||||
|
assert_redirected_to(forum_topic_path(forum_topic))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "destroy action" do
|
||||||
|
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class DmailTest < ActiveSupport::TestCase
|
|||||||
|
|
||||||
context "search" do
|
context "search" do
|
||||||
should "return results based on title contents" do
|
should "return results based on title contents" do
|
||||||
dmail = Factory.create(:dmail, :title => "xxx")
|
dmail = Factory.create(:dmail, :title => "xxx", :owner => @user)
|
||||||
matches = Dmail.search_message("xxx")
|
matches = Dmail.search_message("xxx")
|
||||||
assert(matches.any?)
|
assert(matches.any?)
|
||||||
matches = Dmail.search_message("aaa")
|
matches = Dmail.search_message("aaa")
|
||||||
@@ -26,7 +26,7 @@ class DmailTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
should "return results based on body contents" do
|
should "return results based on body contents" do
|
||||||
dmail = Factory.create(:dmail, :body => "xxx")
|
dmail = Factory.create(:dmail, :body => "xxx", :owner => @user)
|
||||||
matches = Dmail.search_message("xxx")
|
matches = Dmail.search_message("xxx")
|
||||||
assert(matches.any?)
|
assert(matches.any?)
|
||||||
matches = Dmail.search_message("aaa")
|
matches = Dmail.search_message("aaa")
|
||||||
@@ -35,14 +35,14 @@ class DmailTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
should "should parse user names" do
|
should "should parse user names" do
|
||||||
dmail = Factory.build(:dmail)
|
dmail = Factory.build(:dmail, :owner => @user)
|
||||||
dmail.to_id = nil
|
dmail.to_id = nil
|
||||||
dmail.to_name = @user.name
|
dmail.to_name = @user.name
|
||||||
assert(dmail.to_id == @user.id)
|
assert(dmail.to_id == @user.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
should "construct a response" do
|
should "construct a response" do
|
||||||
dmail = Factory.create(:dmail)
|
dmail = Factory.create(:dmail, :owner => @user)
|
||||||
response = dmail.build_response
|
response = dmail.build_response
|
||||||
assert_equal("Re: #{dmail.title}", response.title)
|
assert_equal("Re: #{dmail.title}", response.title)
|
||||||
assert_equal(dmail.from_id, response.to_id)
|
assert_equal(dmail.from_id, response.to_id)
|
||||||
@@ -58,19 +58,19 @@ class DmailTest < ActiveSupport::TestCase
|
|||||||
should "send an email if the user wants it" do
|
should "send an email if the user wants it" do
|
||||||
user = Factory.create(:user, :receive_email_notifications => true)
|
user = Factory.create(:user, :receive_email_notifications => true)
|
||||||
assert_difference("ActionMailer::Base.deliveries.size", 1) do
|
assert_difference("ActionMailer::Base.deliveries.size", 1) do
|
||||||
Factory.create(:dmail, :to => user)
|
Factory.create(:dmail, :to => user, :owner => @user)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
should "be marked as read after the user reads it" do
|
should "be marked as read after the user reads it" do
|
||||||
dmail = Factory.create(:dmail)
|
dmail = Factory.create(:dmail, :owner => @user)
|
||||||
assert(!dmail.is_read?)
|
assert(!dmail.is_read?)
|
||||||
dmail.mark_as_read!
|
dmail.mark_as_read!
|
||||||
assert(dmail.is_read?)
|
assert(dmail.is_read?)
|
||||||
end
|
end
|
||||||
|
|
||||||
should "notify the recipient he has mail" do
|
should "notify the recipient he has mail" do
|
||||||
dmail = Factory.create(:dmail)
|
dmail = Factory.create(:dmail, :owner => @user)
|
||||||
assert(dmail.to(true).has_mail?)
|
assert(dmail.to(true).has_mail?)
|
||||||
dmail.mark_as_read!
|
dmail.mark_as_read!
|
||||||
assert(!dmail.to(true).has_mail?)
|
assert(!dmail.to(true).has_mail?)
|
||||||
|
|||||||
@@ -2,12 +2,47 @@ require_relative '../test_helper'
|
|||||||
|
|
||||||
class ForumPostTest < ActiveSupport::TestCase
|
class ForumPostTest < ActiveSupport::TestCase
|
||||||
context "A forum post" do
|
context "A forum post" do
|
||||||
|
setup do
|
||||||
|
@user = Factory.create(:user)
|
||||||
|
CurrentUser.user = @user
|
||||||
|
CurrentUser.ip_addr = "127.0.0.1"
|
||||||
|
@topic = Factory.create(:forum_topic)
|
||||||
|
end
|
||||||
|
|
||||||
|
teardown do
|
||||||
|
CurrentUser.user = nil
|
||||||
|
CurrentUser.ip_addr = nil
|
||||||
|
end
|
||||||
|
|
||||||
should "update its parent when saved" do
|
should "update its parent when saved" do
|
||||||
topic = Factory.create(:forum_topic)
|
sleep 1
|
||||||
sleep 2
|
post = Factory.create(:forum_post, :topic_id => @topic.id)
|
||||||
post = Factory.create(:forum_post, :topic_id => topic.id)
|
@topic.reload
|
||||||
topic.reload
|
assert(@topic.updated_at > 1.second.ago)
|
||||||
assert(topic.updated_at > 1.second.ago)
|
end
|
||||||
|
|
||||||
|
should "be searchable by body content" do
|
||||||
|
post = Factory.create(:forum_post, :topic_id => @topic.id, :body => "xxx")
|
||||||
|
assert_equal(1, ForumPost.body_matches("xxx").count)
|
||||||
|
assert_equal(0, ForumPost.body_matches("aaa").count)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "initialize its creator" do
|
||||||
|
post = Factory.create(:forum_post, :topic_id => @topic.id)
|
||||||
|
assert_equal(@user.id, post.creator_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
context "updated by a second user" do
|
||||||
|
setup do
|
||||||
|
@post = Factory.create(:forum_post, :topic_id => @topic.id)
|
||||||
|
@second_user = Factory.create(:user)
|
||||||
|
CurrentUser.user = @second_user
|
||||||
|
end
|
||||||
|
|
||||||
|
should "record its updater" do
|
||||||
|
@post.update_attributes(:body => "abc")
|
||||||
|
assert_equal(@second_user.id, @post.updater_id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,46 @@
|
|||||||
require_relative '../test_helper'
|
require_relative '../test_helper'
|
||||||
|
|
||||||
class ForumTopicTest < ActiveSupport::TestCase
|
class ForumTopicTest < ActiveSupport::TestCase
|
||||||
|
context "A forum topic" do
|
||||||
|
setup do
|
||||||
|
@user = Factory.create(:user)
|
||||||
|
CurrentUser.user = @user
|
||||||
|
CurrentUser.ip_addr = "127.0.0.1"
|
||||||
|
@topic = Factory.create(:forum_topic, :title => "xxx")
|
||||||
|
end
|
||||||
|
|
||||||
|
teardown do
|
||||||
|
CurrentUser.user = nil
|
||||||
|
CurrentUser.ip_addr = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
context "constructed with nested attributes for its original post" do
|
||||||
|
should "create a matching forum post" do
|
||||||
|
assert_difference(["ForumTopic.count", "ForumPost.count"], 1) do
|
||||||
|
@topic = Factory.create(:forum_topic, :title => "abc", :original_post_attributes => {:body => "abc"})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
should "be searchable by title" do
|
||||||
|
assert_equal(1, ForumTopic.title_matches("xxx").count)
|
||||||
|
assert_equal(0, ForumTopic.title_matches("aaa").count)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "initialize its creator" do
|
||||||
|
assert_equal(@user.id, @topic.creator_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
context "updated by a second user" do
|
||||||
|
setup do
|
||||||
|
@second_user = Factory.create(:user)
|
||||||
|
CurrentUser.user = @second_user
|
||||||
|
end
|
||||||
|
|
||||||
|
should "record its updater" do
|
||||||
|
@topic.update_attributes(:title => "abc")
|
||||||
|
assert_equal(@second_user.id, @topic.updater_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user