replaces constants by class methods + private functions. Fixes broken tests
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
class Comment < ActiveRecord::Base
|
||||
BODY_LENGTH = {minimum: 10, maximum: 2000}
|
||||
|
||||
acts_as_paranoid column: :hidden_at
|
||||
include ActsAsParanoidAliases
|
||||
@@ -12,7 +11,7 @@ class Comment < ActiveRecord::Base
|
||||
validates :user, presence: true
|
||||
validates_inclusion_of :commentable_type, in: ["Debate"]
|
||||
|
||||
validates :body, length: BODY_LENGTH
|
||||
validate :validate_body_length
|
||||
|
||||
belongs_to :commentable, -> { with_hidden }, polymorphic: true, counter_cache: true
|
||||
belongs_to :user, -> { with_hidden }
|
||||
@@ -97,4 +96,17 @@ class Comment < ActiveRecord::Base
|
||||
self.commentable.try(:after_commented)
|
||||
end
|
||||
|
||||
def self.body_max_length
|
||||
1000
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def validate_body_length
|
||||
validator = ActiveModel::Validations::LengthValidator.new(
|
||||
attributes: :body,
|
||||
maximum: Comment.body_max_length)
|
||||
validator.validate(self)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
require 'numeric'
|
||||
class Debate < ActiveRecord::Base
|
||||
TITLE_LENGTH = {minimum: 10, maximum: Debate.columns.find { |c| c.name == 'title' }.limit || 80 }
|
||||
DESCRIPTION_LENGTH = {minimum: 10, maximum: 6000}
|
||||
|
||||
apply_simple_captcha
|
||||
|
||||
acts_as_votable
|
||||
@@ -18,8 +15,8 @@ class Debate < ActiveRecord::Base
|
||||
validates :description, presence: true
|
||||
validates :author, presence: true
|
||||
|
||||
validates :title, length: TITLE_LENGTH
|
||||
validates :description, length: DESCRIPTION_LENGTH
|
||||
validate :validate_title_length
|
||||
validate :validate_description_length
|
||||
|
||||
validates :terms_of_service, acceptance: { allow_nil: false }, on: :create
|
||||
|
||||
@@ -149,13 +146,40 @@ class Debate < ActiveRecord::Base
|
||||
cached_votes_up/flags_count.to_f < 5
|
||||
end
|
||||
|
||||
def self.title_max_length
|
||||
@@title_max_length ||= self.columns.find { |c| c.name == 'title' }.limit
|
||||
end
|
||||
|
||||
def self.description_max_length
|
||||
6000
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def sanitize_description
|
||||
self.description = WYSIWYGSanitizer.new.sanitize(description)
|
||||
end
|
||||
def sanitize_description
|
||||
self.description = WYSIWYGSanitizer.new.sanitize(description)
|
||||
end
|
||||
|
||||
def sanitize_tag_list
|
||||
self.tag_list = TagSanitizer.new.sanitize_tag_list(self.tag_list)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def validate_description_length
|
||||
validator = ActiveModel::Validations::LengthValidator.new(
|
||||
attributes: :description,
|
||||
minimum: 10,
|
||||
maximum: Debate.description_max_length)
|
||||
validator.validate(self)
|
||||
end
|
||||
|
||||
def validate_title_length
|
||||
validator = ActiveModel::Validations::LengthValidator.new(
|
||||
attributes: :title,
|
||||
minimum: 4,
|
||||
maximum: Debate.title_max_length)
|
||||
validator.validate(self)
|
||||
end
|
||||
|
||||
def sanitize_tag_list
|
||||
self.tag_list = TagSanitizer.new.sanitize_tag_list(self.tag_list)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -4,8 +4,8 @@ class Organization < ActiveRecord::Base
|
||||
belongs_to :user, touch: true
|
||||
|
||||
validates :name, presence: true
|
||||
validates :name, length: NAME_LENGTH
|
||||
validates :name, uniqueness: true
|
||||
validate :validate_name_length
|
||||
|
||||
delegate :email, :phone_number, to: :user
|
||||
|
||||
@@ -35,4 +35,17 @@ class Organization < ActiveRecord::Base
|
||||
text.present? ? joins(:user).where("users.email = ? OR users.phone_number = ? OR organizations.name ILIKE ?", text, text, "%#{text}%") : none
|
||||
end
|
||||
|
||||
def self.name_max_length
|
||||
@@name_max_length ||= self.columns.find { |c| c.name == 'name' }.limit
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def validate_name_length
|
||||
validator = ActiveModel::Validations::LengthValidator.new(
|
||||
attributes: :name,
|
||||
maximum: Organization.name_max_length)
|
||||
validator.validate(self)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -2,8 +2,6 @@ class User < ActiveRecord::Base
|
||||
OMNIAUTH_EMAIL_PREFIX = 'omniauth@participacion'
|
||||
OMNIAUTH_EMAIL_REGEX = /\A#{OMNIAUTH_EMAIL_PREFIX}/
|
||||
|
||||
USERNAME_LENGTH = {maximum: User.columns.find { |c| c.name == 'username' }.limit || 60}
|
||||
|
||||
include Verification
|
||||
|
||||
apply_simple_captcha
|
||||
@@ -25,7 +23,8 @@ class User < ActiveRecord::Base
|
||||
|
||||
validates :username, presence: true, unless: :organization?
|
||||
validates :username, uniqueness: true, unless: :organization?
|
||||
validates :username, length: USERNAME_LENGTH
|
||||
validate :validate_username_length
|
||||
|
||||
validates :official_level, inclusion: {in: 0..5}
|
||||
validates_format_of :email, without: OMNIAUTH_EMAIL_REGEX, on: :update
|
||||
validates :terms_of_service, acceptance: { allow_nil: false }, on: :create
|
||||
@@ -129,13 +128,26 @@ class User < ActiveRecord::Base
|
||||
Comment.hide_all comments_ids
|
||||
end
|
||||
|
||||
def self.search(term)
|
||||
term.present? ? where("email = ? OR username ILIKE ?", term, "%#{term}%") : none
|
||||
end
|
||||
|
||||
def email_provided?
|
||||
!!(email && email !~ OMNIAUTH_EMAIL_REGEX) ||
|
||||
!!(unconfirmed_email && unconfirmed_email !~ OMNIAUTH_EMAIL_REGEX)
|
||||
end
|
||||
|
||||
def self.search(term)
|
||||
term.present? ? where("email = ? OR username ILIKE ?", term, "%#{term}%") : none
|
||||
end
|
||||
|
||||
def self.username_max_length
|
||||
@@username_max_length ||= self.columns.find { |c| c.name == 'username' }.limit
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def validate_username_length
|
||||
validator = ActiveModel::Validations::LengthValidator.new(
|
||||
attributes: :username,
|
||||
maximum: User.username_max_length)
|
||||
validator.validate(self)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
<%= f.text_field :phone_number, placeholder: t("account.show.phone_number_label") %>
|
||||
|
||||
<% else %>
|
||||
<%= f.text_field :username, maxlength: User::USERNAME_LENGTH[:maximum], placeholder: t("account.show.username_label") %>
|
||||
<%= f.text_field :username, maxlength: User.username_max_length, placeholder: t("account.show.username_label") %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<div id="js-comment-form-<%= css_id %>" <%= "style='display:none'".html_safe if toggeable %>>
|
||||
<%= form_for [commentable, Comment.new], remote: true do |f| %>
|
||||
<%= label_tag "comment-body-#{css_id}", t("comments.form.leave_comment") %>
|
||||
<%= f.text_area :body, id: "comment-body-#{css_id}", maxlength: Comment::BODY_LENGTH[:maximum], label: false %>
|
||||
<%= f.text_area :body, id: "comment-body-#{css_id}", maxlength: Comment.body_max_length, label: false %>
|
||||
<%= f.hidden_field :commentable_type, value: commentable.class.name %>
|
||||
<%= f.hidden_field :commentable_id, value: commentable.id %>
|
||||
<%= f.hidden_field :parent_id, value: parent_id %>
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
<div class="row">
|
||||
<div class="small-12 column">
|
||||
<%= f.label :title, t("debates.form.debate_title") %>
|
||||
<%= f.text_field :title, maxlength: Debate::TITLE_LENGTH[:maximum], placeholder: t("debates.form.debate_title"), label: false %>
|
||||
<%= f.text_field :title, maxlength: Debate.title_max_length, placeholder: t("debates.form.debate_title"), label: false %>
|
||||
</div>
|
||||
|
||||
<div class="ckeditor small-12 column">
|
||||
<%= f.label :description, t("debates.form.debate_text") %>
|
||||
<%= f.cktext_area :description, maxlength: Debate::DESCRIPTION_LENGTH[:maximum], ckeditor: { language: I18n.locale }, label: false %>
|
||||
<%= f.cktext_area :description, maxlength: Debate.description_max_length, ckeditor: { language: I18n.locale }, label: false %>
|
||||
</div>
|
||||
|
||||
<div class="small-12 column">
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
<%= f.label t("devise_views.users.registrations.new.username_label") %>
|
||||
<span class="note"><%= t("devise_views.users.registrations.new.username_note") %></span>
|
||||
<%= f.text_field :username, maxlength: User::USERNAME_LENGTH[:maximum], placeholder: t("devise_views.users.registrations.new.username_label"), label: false %>
|
||||
<%= f.text_field :username, maxlength: User.username_max_length, placeholder: t("devise_views.users.registrations.new.username_label"), label: false %>
|
||||
|
||||
<%= f.email_field :email, placeholder: t("devise_views.users.registrations.new.email_label") %>
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ describe DebatesController do
|
||||
|
||||
sign_in create(:user)
|
||||
|
||||
post :create, debate: { title: 'foo', description: 'foo bar', terms_of_service: 1 }
|
||||
post :create, debate: { title: 'A sample debate', description: 'this is a sample debate', terms_of_service: 1 }
|
||||
expect(Ahoy::Event.where(name: :debate_created).count).to eq 1
|
||||
expect(Ahoy::Event.last.properties['debate_id']).to eq Debate.last.id
|
||||
end
|
||||
|
||||
@@ -117,7 +117,7 @@ feature 'Debates' do
|
||||
click_button "Start a debate"
|
||||
|
||||
expect(page).to_not have_content "Debate was successfully created."
|
||||
expect(page).to have_content "1 error"
|
||||
expect(page).to have_content "error"
|
||||
within(".tags") do
|
||||
expect(page).to have_content featured_tag.name
|
||||
expect(page).to_not have_content tag.name
|
||||
@@ -138,7 +138,7 @@ feature 'Debates' do
|
||||
login_as(author)
|
||||
|
||||
visit new_debate_path
|
||||
fill_in 'debate_title', with: 'A test'
|
||||
fill_in 'debate_title', with: 'Testing an attack'
|
||||
fill_in 'debate_description', with: '<p>This is <script>alert("an attack");</script></p>'
|
||||
fill_in 'debate_captcha', with: correct_captcha_text
|
||||
check 'debate_terms_of_service'
|
||||
@@ -146,7 +146,7 @@ feature 'Debates' do
|
||||
click_button 'Start a debate'
|
||||
|
||||
expect(page).to have_content 'Debate was successfully created.'
|
||||
expect(page).to have_content 'A test'
|
||||
expect(page).to have_content 'Testing an attack'
|
||||
expect(page.html).to include '<p>This is alert("an attack");</p>'
|
||||
expect(page.html).to_not include '<script>alert("an attack");</script>'
|
||||
expect(page.html).to_not include '<p>This is'
|
||||
@@ -186,8 +186,8 @@ feature 'Debates' do
|
||||
scenario 'using dangerous strings' do
|
||||
visit new_debate_path
|
||||
|
||||
fill_in 'debate_title', with: 'A test'
|
||||
fill_in 'debate_description', with: 'A test'
|
||||
fill_in 'debate_title', with: 'A test of dangerous strings'
|
||||
fill_in 'debate_description', with: 'A description suitable for this test'
|
||||
fill_in 'debate_captcha', with: correct_captcha_text
|
||||
check 'debate_terms_of_service'
|
||||
|
||||
@@ -233,14 +233,14 @@ feature 'Debates' do
|
||||
expect(current_path).to eq(edit_debate_path(debate))
|
||||
|
||||
fill_in 'debate_title', with: "End child poverty"
|
||||
fill_in 'debate_description', with: "Let's..."
|
||||
fill_in 'debate_description', with: "Let's do something to end child poverty"
|
||||
fill_in 'debate_captcha', with: correct_captcha_text
|
||||
|
||||
click_button "Save changes"
|
||||
|
||||
expect(page).to have_content "Debate was successfully updated."
|
||||
expect(page).to have_content "End child poverty"
|
||||
expect(page).to have_content "Let's..."
|
||||
expect(page).to have_content "Let's do something to end child poverty"
|
||||
end
|
||||
|
||||
scenario 'Errors on update' do
|
||||
@@ -266,7 +266,7 @@ feature 'Debates' do
|
||||
click_button "Save changes"
|
||||
|
||||
expect(page).to_not have_content "Debate was successfully updated."
|
||||
expect(page).to have_content "1 error"
|
||||
expect(page).to have_content "error"
|
||||
|
||||
fill_in 'debate_captcha', with: correct_captcha_text
|
||||
click_button "Save changes"
|
||||
@@ -288,7 +288,7 @@ feature 'Debates' do
|
||||
click_button "Save changes"
|
||||
|
||||
expect(page).to_not have_content "Debate was successfully updated."
|
||||
expect(page).to have_content "1 error"
|
||||
expect(page).to have_content "error"
|
||||
within(".tags") do
|
||||
expect(page).to have_content featured_tag.name
|
||||
expect(page).to_not have_content tag.name
|
||||
@@ -438,7 +438,7 @@ feature 'Debates' do
|
||||
scenario 'Debate index search' do
|
||||
debate1 = create(:debate, title: "Show me what you got")
|
||||
debate2 = create(:debate, title: "Get Schwifty")
|
||||
debate3 = create(:debate, description: "Unity")
|
||||
debate3 = create(:debate)
|
||||
debate4 = create(:debate, description: "Schwifty in here")
|
||||
|
||||
visit debates_path
|
||||
|
||||
Reference in New Issue
Block a user