merges master and fixes conflicts

This commit is contained in:
kikito
2015-08-17 17:38:34 +02:00
51 changed files with 579 additions and 60 deletions

View File

@@ -34,6 +34,7 @@ gem 'cancancan'
gem 'social-share-button'
gem 'initialjs-rails'
gem 'unicorn'
gem 'paranoia'
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console

View File

@@ -179,6 +179,8 @@ GEM
nokogiri (1.6.6.2)
mini_portile (~> 0.6.0)
orm_adapter (0.5.0)
paranoia (2.1.3)
activerecord (~> 4.0)
pg (0.18.2)
poltergeist (1.6.0)
capybara (~> 2.1)
@@ -331,6 +333,7 @@ DEPENDENCIES
kaminari
launchy
letter_opener_web (~> 1.2.0)
paranoia
pg
poltergeist
quiet_assets

View File

@@ -1,8 +1,11 @@
App.Comments =
add_response: (parent_id, response_html) ->
add_comment: (parent_id, response_html) ->
$(response_html).insertAfter($("#js-comment-form-#{parent_id}"))
add_reply: (parent_id, response_html) ->
$("##{parent_id} .comment-children:first").prepend($(response_html))
display_error: (field_with_errors, error_html) ->
$(error_html).insertAfter($("#{field_with_errors}"))

View File

@@ -0,0 +1,7 @@
App.ModeratorComments =
add_class_faded: (id) ->
$("##{id} .comment-body:first").addClass("faded")
hide_moderator_actions: (id) ->
$("##{id} #moderator-comment-actions:first").hide()

View File

@@ -0,0 +1,8 @@
App.ModeratorDebates =
add_class_faded: (id) ->
$("##{id}").addClass("faded")
$("#comments").addClass("faded")
hide_moderator_actions: (id) ->
$("##{id} #moderator-debate-actions:first").hide()

View File

@@ -571,4 +571,9 @@
}
}
}
}
.faded {
opacity: 0.4;
}

View File

@@ -134,7 +134,7 @@ header {
min-height: rem-calc(480);
&.results {
min-height: rem-calc(192);
min-height: rem-calc(216);
}
h1 {
@@ -276,6 +276,35 @@ header {
}
}
.subnavigation {
background: white;
border-bottom: 1px solid white;
clear: both;
a {
color: $link;
font-size: rem-calc(14);
font-weight: bold;
&.active {
color: $text;
&:after {
bottom: -17px;
left: 50%;
border: solid transparent;
content: " ";
height: 0;
width: 0;
position: absolute;
border-top-color: #fff;
border-width: 8px;
margin-left: -8px;
}
}
}
}
// 05. Footer
// - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@@ -1,6 +1,5 @@
class Admin::BaseController < ApplicationController
layout 'admin'
before_action :authenticate_user!
skip_authorization_check

View File

@@ -0,0 +1,13 @@
class Admin::CommentsController < Admin::BaseController
def index
@comments = Comment.only_hidden
end
def restore
@comment = Comment.with_hidden.find(params[:id])
@comment.restore
redirect_to admin_comments_path, notice: t('admin.comments.restore.success')
end
end

View File

@@ -1,5 +1,4 @@
class Admin::DashboardController < Admin::BaseController
layout 'admin'
def index
end

View File

@@ -0,0 +1,16 @@
class Admin::DebatesController < Admin::BaseController
def index
@debates = Debate.only_hidden
end
def show
@debate = Debate.with_hidden.find(params[:id])
end
def restore
@debate = Debate.with_hidden.find(params[:id])
@debate.restore
redirect_to admin_debates_path, notice: t('admin.debates.restore.success')
end
end

View File

@@ -2,6 +2,7 @@ class CommentsController < ApplicationController
before_action :authenticate_user!
before_action :build_comment, only: :create
before_action :parent, only: :create
load_and_authorize_resource
respond_to :html, :js
@@ -50,4 +51,5 @@ class CommentsController < ApplicationController
def email_on_comment_reply?
reply? && parent.author.email_on_comment_reply?
end
end

View File

@@ -1,6 +1,8 @@
class DebatesController < ApplicationController
before_action :authenticate_user!, except: [:index, :show]
load_and_authorize_resource
respond_to :html, :js
def index
@debates = Debate.search(params)
@@ -9,6 +11,7 @@ class DebatesController < ApplicationController
def show
set_debate_votes(@debate)
@comments = @debate.root_comments.with_hidden.recent
end
def new
@@ -46,7 +49,6 @@ class DebatesController < ApplicationController
set_debate_votes(@debate)
end
private
def debate_params

View File

@@ -0,0 +1,8 @@
class Moderation::CommentsController < Moderation::BaseController
def hide
@comment = Comment.find(params[:id])
@comment.hide
end
end

View File

@@ -1,5 +1,4 @@
class Moderation::DashboardController < Moderation::BaseController
layout 'admin'
def index
end

View File

@@ -0,0 +1,7 @@
class Moderation::DebatesController < Moderation::BaseController
def hide
@debate = Debate.find(params[:id])
@debate.hide
end
end

View File

@@ -0,0 +1,7 @@
module AbilitiesHelper
def moderator?
current_user.try(:moderator?)
end
end

View File

@@ -27,8 +27,12 @@ class Ability
can(:verify, Organization){ |o| !o.verified? }
can(:reject, Organization){ |o| !o.rejected? }
can :hide, Comment
can :hide, Debate
elsif user.administrator?
can :restore, Comment
can :restore, Debate
end
end
end

View File

@@ -1,5 +1,8 @@
class Comment < ActiveRecord::Base
include ActsAsParanoidAliases
acts_as_nested_set scope: [:commentable_id, :commentable_type], counter_cache: :children_count
acts_as_paranoid column: :hidden_at
acts_as_votable
validates :body, presence: true

View File

@@ -1,5 +1,6 @@
require 'numeric'
class Debate < ActiveRecord::Base
include ActsAsParanoidAliases
default_scope { order('created_at DESC') }
apply_simple_captcha
@@ -8,6 +9,7 @@ class Debate < ActiveRecord::Base
acts_as_votable
acts_as_commentable
acts_as_taggable
acts_as_paranoid column: :hidden_at
belongs_to :author, class_name: 'User', foreign_key: 'author_id'

View File

@@ -1,6 +1,6 @@
<div id="admin_menu">
<ul>
<li><%= link_to t('admin.menu.tags'), admin_tags_path %></li>
<ul id="admin_menu">
<li><%= link_to t('admin.menu.debate_topics'), admin_tags_path %></li>
<li><%= link_to t('admin.menu.hidden_debates'), admin_debates_path %></li>
<li><%= link_to t('admin.menu.hidden_comments'), admin_comments_path %></li>
<li><%= link_to t('admin.menu.organizations'), admin_organizations_path %></li>
</ul>
</div>

View File

@@ -0,0 +1,14 @@
<div class="left">
<h1><%= t("admin.comments.index.title") %></h1>
<ul>
<% @comments.each do |comment| %>
<li id="<%= dom_id(comment) %>">
<%= comment.body %>
<%= link_to t("admin.actions.restore"), restore_admin_comment_path(comment),
method: :put, data: { confirm: t("admin.actions.confirm") } %>
</li>
<% end %>
</ul>
</div>

View File

@@ -0,0 +1,13 @@
<div class="left">
<h1><%= t("admin.debates.index.title") %></h1>
<ul>
<% @debates.each do |debate| %>
<%= link_to admin_debate_path(debate) do %>
<li id="<%= dom_id(debate) %>">
<%= link_to debate.title, admin_debate_path(debate) %>
</li>
<% end %>
<% end %>
</ul>
</div>

View File

@@ -0,0 +1,13 @@
<div class="left">
<h1><%= t("admin.debates.index.title") %></h1>
<div>
<div><%= @debate.title %></div>
<div><%= @debate.description %></div>
<div>
<%= link_to t('admin.actions.restore'), restore_admin_debate_path(@debate),
method: :put, data: { confirm: t('admin.actions.confirm') } %>
</div>
</div>
</div>

View File

@@ -0,0 +1,5 @@
<span id="moderator-comment-actions">
&nbsp;|&nbsp;
<%= link_to t("admin.actions.hide").capitalize, hide_moderation_comment_path(comment),
method: :put, remote: true, data: { confirm: t('admin.actions.confirm') } %>
</span>

View File

@@ -1,5 +1,9 @@
<div class="row">
<div id="comment-<%= comment.id %>" class="comment small-12 column">
<div id="<%= dom_id(comment) %>" class="comment small-12 column">
<% if comment.hidden? %>
<%= t("debates.comment.deleted") %>
<% else %>
<%= avatar_image(comment.user, size: 32, class: 'left') %>
@@ -15,15 +19,25 @@
<p class="reply">
<%= t("debates.comment.responses", count: comment.children_count) %>
<% if user_signed_in? %>
&nbsp;|&nbsp;
<%= link_to(comment_link_text(comment), "",
class: "js-add-comment-link", data: {'id': dom_id(comment)}) %>
<% if moderator? %>
<%= render 'comments/actions', comment: comment %>
<% end %>
<%= render 'comments/form', {parent: comment, toggeable: true} %>
<% end %>
</p>
</div>
<% end %>
<div class="comment-children">
<%= render comment.children.reorder('id DESC, lft') %>
<%= render comment.children.with_deleted.reorder('id DESC, lft') %>
</div>
</div>

View File

@@ -1,5 +1,3 @@
<%= link_to(comment_link_text(parent), "", class: "js-add-comment-link", data: {'id': dom_id(parent)}) if toggeable %>
<div id="js-comment-form-<%= dom_id(parent) %>" <%= "style='display:none'".html_safe if toggeable %>>
<%= form_for [@debate, Comment.new], remote: true do |f| %>
<%= f.text_area :body %>

View File

@@ -1,9 +1,10 @@
var parent_id = '<%= dom_id(@parent) %>';
var parent_id = "<%= dom_id(@parent) %>";
var comment_html = "<%= j(render @comment) %>"
<% if @parent.is_a?(Debate) -%>
App.Comments.reset_form(parent_id);
App.Comments.add_comment(parent_id, comment_html);
<% else -%>
App.Comments.reset_and_hide_form(parent_id);
App.Comments.add_reply(parent_id, comment_html);
<% end -%>
App.Comments.add_response(parent_id, "<%= j(render @comment) %>");

View File

@@ -0,0 +1,2 @@
<%= link_to t("admin.actions.hide").capitalize, hide_moderation_debate_path(debate),
method: :put, remote: true, data: { confirm: t('admin.actions.confirm') } %>

View File

@@ -1,5 +1,5 @@
<section class="debate-show">
<div id="debate-<%= @debate.id %>" class="row">
<div id="<%= dom_id(@debate) %>" class="row">
<div class="small-12 medium-9 column">
<i class="icon-angle-left left"></i>&nbsp;<%= link_to t("debates.show.back_link"), debates_path, class: 'left back' %>
@@ -21,12 +21,19 @@
<span class="bullet">&nbsp;&bullet;&nbsp;</span>
<%= l @debate.created_at.to_date %>
<span class="bullet">&nbsp;&bullet;&nbsp;</span>
<i class="icon-chat-bubble-two"></i>&nbsp;<%= link_to t("debates.show.comments", count: @debate.comment_threads.count), "#comments" %>
<i class="icon-chat-bubble-two"></i>&nbsp;
<%= link_to t("debates.show.comments", count: @debate.comment_threads.count), "#comments" %>
</div>
<%= @debate.description %>
<%= render 'shared/tags', debate: @debate %>
<% if moderator? %>
<div id='moderator-debate-actions'>
<%= render 'actions', debate: @debate %>
</div>
<% end %>
</div>
<aside class="small-12 medium-3 column">
@@ -40,6 +47,7 @@
<div class="sidebar-divider"></div>
<h3><%= t("debates.show.share") %></h3>
<%= social_share_button_tag(@debate.title) %>
<% if user_signed_in? %>
<%= link_to t("debates.show.leave_comment"), "#comments", class: "leave-comment" %>
<% else %>
@@ -63,7 +71,8 @@
<%= render 'comments/form', {parent: @debate, toggeable: false} %>
</div>
<% end %>
<%= render @debate.root_comments.recent %>
<%= render @comments %>
</div>
</div>
</section>

View File

@@ -0,0 +1,50 @@
<header class="<%= header_css %>">
<section class="top-links">
<div class="row">
<div class="language">
<span id="locale-switcher">
<%= t("layouts.header.language") %>
[
<% available_locales_to_switch.each do |locale| %>
<%= link_to(locale, params.merge(locale: locale), id: "locale-link-#{locale}") %>
<% end %>
]
</div>
<div class="external-links">
<%= link_to t("layouts.header.participation"), root_path, class: "selected" %>&nbsp;|
<%= link_to t("layouts.header.external_link_transparency"), "#" %>&nbsp;|
<%= link_to t("layouts.header.external_link_opendata"), "#" %>&nbsp;|
<%= link_to t("layouts.header.external_link_blog"), "#" %>
</div>
</div>
</section>
<div class="contain-to-grid clear">
<nav class="top-bar" data-topbar role="navigation">
<ul class="title-area">
<li class="name">
<%= link_to root_path do %>
<%= image_tag('header_logo_madrid.png', class: 'left', size: '96x96') %>
<%= t("layouts.header.open_gov", open: "<strong>#{t('layouts.header.open')}</strong>").html_safe %> | <span><%= t("layouts.header.participation") %></span>
<% end %>
</li>
<li class="toggle-topbar menu-icon"><a href="#"><span><%= t("layouts.header.menu") %></span></a></li>
</ul>
<section class="top-bar-section">
<%= render 'devise/menu/login_items' %>
<%= render 'shared/admin_login_items' %>
</section>
</nav>
</div>
<% if home_page? %>
<div class="row home-page">
<div class="small-12 column text-center">
<h1><%= t("layouts.header.open_city") %></h1>
<h2><%= t("layouts.header.open_city_slogan") %></h2>
<%= link_to t("layouts.header.see_all_debates"), debates_path, class: 'button radius' %>
</div>
</div>
<% end %>
</header>

View File

@@ -35,6 +35,21 @@
<%= render 'devise/menu/login_items' %>
<%= render 'shared/admin_login_items' %>
</section>
<section class="subnavigation row text-center">
<div class="small-12 medium-3 column end">
<%= link_to t("layouts.header.welcome"), root_path, class: ("active" if current_page?(root_path)) %>
</div>
<div class="small-12 medium-3 column end">
<%= link_to t("layouts.header.news"), "#" %>
</div>
<div class="small-12 medium-3 column end">
<%= link_to t("layouts.header.debates"), debates_path, class: ("active" if current_page?(controller: 'debates')) %>
</div>
<div class="small-12 medium-3 column end">
<%= link_to t("layouts.header.initiatives"), "#" %>
</div>
</section>
</nav>
</div>

View File

@@ -13,7 +13,7 @@
</head>
<body>
<%= render 'layouts/header' %>
<%= render 'layouts/admin_header' %>
<% if notice %>
<p class="alert-box success"><%= notice %></p>

View File

@@ -0,0 +1,3 @@
var comment_id = '<%= dom_id(@comment) %>';
App.ModeratorComments.add_class_faded(comment_id);
App.ModeratorComments.hide_moderator_actions(comment_id);

View File

@@ -0,0 +1,3 @@
var debate_id = '<%= dom_id(@debate) %>';
App.ModeratorDebates.add_class_faded(debate_id);
App.ModeratorDebates.hide_moderator_actions(debate_id);

View File

@@ -1,11 +1,13 @@
en:
admin:
menu:
tags: Tags
organizations: Organizations
dashboard:
index:
title: Administration
menu:
debate_topics: Debate topics
hidden_debates: Hidden debates
hidden_comments: Hidden comments
organizations: Organizations
organizations:
index:
title: Organizations
@@ -19,6 +21,10 @@ en:
pending: Pending
verified: Verified
rejected: Rejected
actions:
hide: Hide
restore: Restore
confirm: 'Are you sure?'
tags:
index:
title: 'Debate topics'
@@ -27,4 +33,13 @@ en:
name:
placeholder: 'Write a topic'
destroy: Delete Tag
comments:
index:
title: Hidden comments
restore:
success: The comment has been restored
debates:
index:
title: Hidden debates
restore:
success: The debate has been restored

View File

@@ -1,11 +1,13 @@
es:
admin:
menu:
tags: Temas de debate
organizations: Organizaciones
dashboard:
index:
title: Administración
menu:
debate_topics: Temas de debate
hidden_debates: Debates ocultos
hidden_comments: Comentarios ocultos
organizations: Organizaciones
organizations:
index:
title: Organizaciones
@@ -19,6 +21,10 @@ es:
pending: Pendientes
verified: Verificadas
rejected: Rechazadas
actions:
hide: Ocultar
restore: Permitir
confirm: '¿Estás seguro?'
tags:
index:
title: 'Temas de debate'
@@ -27,3 +33,13 @@ es:
name:
placeholder: 'Escribe el nombre del tema'
destroy: Elimina la etiqueta
comments:
index:
title: Comentarios ocultos
restore:
success: El comentario ha sido permitido
debates:
index:
title: Debates ocultos
restore:
success: El debate ha sido permitido

View File

@@ -15,6 +15,10 @@ en:
language: Site language
administration: Administration
moderation: Moderation
welcome: Welcome
news: News
debates: Debates
initiatives: Initiatives
footer:
copyright: "Ayuntamiento de Madrid, 2015. All rights reserved"
form:
@@ -38,6 +42,7 @@ en:
one: 1 vote
other: "%{count} votes"
comment:
deleted: This comment has been deleted
responses:
zero: No Responses
one: 1 Response

View File

@@ -15,6 +15,10 @@ es:
language: Idioma de la página
administration: Administar
moderation: Moderar
welcome: Portada
news: Novedades
debates: Debates
initiatives: Iniciativas
footer:
copyright: "Ayuntamiento de Madrid, %{year}. Todos los derechos reservados"
form:
@@ -38,6 +42,7 @@ es:
one: 1 voto
other: "%{count} votos"
comment:
deleted: Este comentario ha sido eliminado
responses:
zero: Sin respuestas
one: 1 Respuesta

View File

@@ -13,14 +13,10 @@ Rails.application.routes.draw do
root 'welcome#index'
resources :debates do
member do
post :vote
end
member { post :vote }
resources :comments, only: :create, shallow: true do
member do
post :vote
end
member { post :vote }
end
end
@@ -35,11 +31,27 @@ Rails.application.routes.draw do
end
end
resources :debates, only: [:index, :show] do
member { put :restore }
end
resources :comments, only: :index do
member { put :restore }
end
resources :tags, only: [:index, :create, :update, :destroy]
end
namespace :moderation do
root to: "dashboard#index"
resources :debates, only: [] do
member { put :hide }
end
resources :comments, only: [:index] do
member { put :hide }
end
end
# Example of regular route:

View File

@@ -0,0 +1,6 @@
class AddHiddenAtToComments < ActiveRecord::Migration
def change
add_column :comments, :hidden_at, :datetime
add_index :comments, :hidden_at
end
end

View File

@@ -0,0 +1,6 @@
class AddHiddenAtToDebates < ActiveRecord::Migration
def change
add_column :debates, :hidden_at, :datetime
add_index :debates, :hidden_at
end
end

View File

@@ -12,7 +12,6 @@
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20150815154430) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -35,9 +34,11 @@ ActiveRecord::Schema.define(version: 20150815154430) do
t.datetime "created_at"
t.datetime "updated_at"
t.integer "children_count", default: 0
t.datetime "hidden_at"
end
add_index "comments", ["commentable_id", "commentable_type"], name: "index_comments_on_commentable_id_and_commentable_type", using: :btree
add_index "comments", ["hidden_at"], name: "index_comments_on_hidden_at", using: :btree
add_index "comments", ["user_id"], name: "index_comments_on_user_id", using: :btree
create_table "debates", force: :cascade do |t|
@@ -46,8 +47,11 @@ ActiveRecord::Schema.define(version: 20150815154430) do
t.integer "author_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "hidden_at"
end
add_index "debates", ["hidden_at"], name: "index_debates_on_hidden_at", using: :btree
create_table "moderators", force: :cascade do |t|
t.integer "user_id"
end

View File

@@ -0,0 +1,29 @@
module ActsAsParanoidAliases
def self.included(base)
base.extend(ClassMethods)
def hide
update_attribute(:hidden_at, Time.now)
end
def hidden?
deleted?
end
end
module ClassMethods
def with_hidden
with_deleted
end
def only_hidden
only_deleted
end
end
end
module ActsAsParanoid
include ActsAsParanoidAliases
end

View File

@@ -13,6 +13,10 @@ FactoryGirl.define do
description 'Debate description'
terms_of_service '1'
association :author, factory: :user
trait :hidden do
hidden_at Time.now
end
end
factory :vote do
@@ -25,6 +29,10 @@ FactoryGirl.define do
association :commentable, factory: :debate
user
body 'Comment body'
trait :hidden do
hidden_at Time.now
end
end
factory :administrator do

View File

@@ -0,0 +1,28 @@
require 'rails_helper'
feature 'Admin comments' do
scenario 'Restore', :js do
citizen = create(:user)
admin = create(:administrator)
debate = create(:debate)
comment = create(:comment, :hidden, commentable: debate, body: 'Not really SPAM')
login_as(admin.user)
visit admin_comments_path
within("#comment_#{comment.id}") do
first(:link, "Restore").click
end
expect(page).to have_content 'The comment has been restored'
login_as(citizen)
visit debate_path(debate)
expect(page).to have_css('.comment', count: 1)
expect(page).to have_content('Not really SPAM')
end
end

View File

@@ -0,0 +1,23 @@
require 'rails_helper'
feature 'Admin debates' do
scenario 'Restore', :js do
citizen = create(:user)
admin = create(:administrator)
debate = create(:debate, :hidden)
login_as(admin.user)
visit admin_debate_path(debate)
click_link 'Restore'
expect(page).to have_content 'The debate has been restored'
login_as(citizen)
visit debates_path
expect(page).to have_css('.debate', count: 1)
end
end

View File

@@ -77,7 +77,7 @@ feature 'Comments' do
click_button 'Publish reply'
end
within("#comment-#{comment.id}") do
within "#comment_#{comment.id}" do
expect(page).to have_content 'It will be done next week.'
end

View File

@@ -0,0 +1,72 @@
require 'rails_helper'
feature 'Moderate Comments' do
scenario 'Hide', :js do
citizen = create(:user)
moderator = create(:moderator)
debate = create(:debate)
comment = create(:comment, commentable: debate, body: 'SPAM')
login_as(moderator.user)
visit debate_path(debate)
within("#comment_#{comment.id}") do
click_link 'Hide'
expect(page).to have_css('.comment .faded')
end
login_as(citizen)
visit debate_path(debate)
expect(page).to have_css('.comment', count: 1)
expect(page).to have_content('This comment has been deleted')
expect(page).to_not have_content('SPAM')
end
scenario 'Children visible', :js do
citizen = create(:user)
moderator = create(:moderator)
debate = create(:debate)
comment = create(:comment, commentable: debate, body: 'SPAM')
reply = create(:comment, commentable: debate, body: 'Acceptable reply', parent_id: comment.id)
login_as(moderator.user)
visit debate_path(debate)
within("#comment_#{comment.id}") do
first(:link, "Hide").click
expect(page).to have_css('.comment .faded')
end
login_as(citizen)
visit debate_path(debate)
expect(page).to have_css('.comment', count: 2)
expect(page).to have_content('This comment has been deleted')
expect(page).to_not have_content('SPAM')
expect(page).to have_content('Acceptable reply')
end
scenario 'Moderator actions' do
citizen = create(:user)
moderator = create(:moderator)
debate = create(:debate)
comment = create(:comment, commentable: debate)
login_as(moderator.user)
visit debate_path(debate)
expect(page).to have_css("#moderator-comment-actions")
login_as(citizen)
visit debate_path(debate)
expect(page).to_not have_css("#moderator-comment-actions")
end
end

View File

@@ -0,0 +1,24 @@
require 'rails_helper'
feature 'Moderate debates' do
scenario 'Hide', :js do
citizen = create(:user)
moderator = create(:moderator)
debate = create(:debate)
login_as(moderator.user)
visit debate_path(debate)
within("#debate_#{debate.id}") do
click_link 'Hide'
end
login_as(citizen)
visit debates_path
expect(page).to have_css('.debate', count: 0)
end
end

View File

@@ -4,6 +4,7 @@ require 'cancan/matchers'
describe Ability do
subject(:ability) { Ability.new(user) }
let(:debate) { Debate.new }
let(:comment) { create(:comment) }
describe "Non-logged in user" do
let(:user) { nil }
@@ -84,6 +85,12 @@ describe Ability do
it { should_not be_able_to(:reject, rejected_organization) }
it { should be_able_to( :verify, rejected_organization) }
end
it { should be_able_to(:hide, comment) }
it { should be_able_to(:hide, debate) }
it { should_not be_able_to(:restore, comment) }
it { should_not be_able_to(:restore, debate) }
end
describe "Administrator" do
@@ -94,5 +101,7 @@ describe Ability do
it { should be_able_to(:show, debate) }
it { should be_able_to(:vote, debate) }
it { should be_able_to(:restore, comment) }
it { should be_able_to(:restore, debate) }
end
end