diff --git a/.travis.yml b/.travis.yml
index 465c6366dfd..b984dfd2f40 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -24,6 +24,7 @@ matrix:
fast_finish: true
rvm:
+ - 2.4.1
- 2.3.3
services:
diff --git a/Gemfile b/Gemfile
index 0ae1f8ff4c1..faa614e12d2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -112,6 +112,7 @@ group :assets do
end
group :test do
+ gem 'webmock', require: false
gem 'fakeweb', '~> 1.3.0', require: false
gem 'minitest', require: false
gem 'timecop'
diff --git a/Gemfile.lock b/Gemfile.lock
index 0222599a113..64a64c3dc61 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -37,6 +37,8 @@ GEM
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
+ addressable (2.5.1)
+ public_suffix (~> 2.0, >= 2.0.2)
annotate (2.7.1)
activerecord (>= 3.2, < 6.0)
rake (>= 10.4, < 12.0)
@@ -69,6 +71,8 @@ GEM
coderay (1.1.1)
concurrent-ruby (1.0.5)
connection_pool (2.2.0)
+ crack (0.4.3)
+ safe_yaml (~> 1.0.0)
crass (1.0.2)
debug_inspector (0.0.2)
diff-lcs (1.2.5)
@@ -113,6 +117,7 @@ GEM
globalid (0.3.7)
activesupport (>= 4.1.0)
guess_html_encoding (0.0.11)
+ hashdiff (0.3.2)
hashie (3.5.5)
highline (1.7.8)
hiredis (0.6.1)
@@ -228,6 +233,7 @@ GEM
pry (>= 0.9.10, < 0.11.0)
pry-rails (0.3.4)
pry (>= 0.9.10)
+ public_suffix (2.0.5)
puma (3.6.0)
r2 (0.2.6)
rack (1.6.5)
@@ -316,6 +322,7 @@ GEM
guess_html_encoding (>= 0.0.4)
nokogiri (>= 1.6.0)
ruby_dep (1.5.0)
+ safe_yaml (1.0.4)
sanitize (4.4.0)
crass (~> 1.0.2)
nokogiri (>= 1.4.4)
@@ -377,6 +384,10 @@ GEM
kgio (~> 2.6)
raindrops (~> 0.7)
uniform_notifier (1.10.0)
+ webmock (3.0.1)
+ addressable (>= 2.3.6)
+ crack (>= 0.3.2)
+ hashdiff
PLATFORMS
ruby
@@ -477,6 +488,7 @@ DEPENDENCIES
uglifier
unf
unicorn
+ webmock
BUNDLED WITH
1.14.6
diff --git a/app/assets/javascripts/discourse/templates/user.hbs b/app/assets/javascripts/discourse/templates/user.hbs
index 13f1c6b222c..7970c3f9a00 100644
--- a/app/assets/javascripts/discourse/templates/user.hbs
+++ b/app/assets/javascripts/discourse/templates/user.hbs
@@ -24,8 +24,8 @@
{{#if model.number_of_suspensions}}
{{model.number_of_suspensions}} {{i18n 'user.staff_counters.suspensions'}}
{{/if}}
- {{#if model.number_of_warnings}}
- {{model.number_of_warnings}} {{i18n 'user.staff_counters.warnings_received'}}
+ {{#if model.warnings_received_count}}
+ {{model.warnings_received_count}} {{i18n 'user.staff_counters.warnings_received'}}
{{/if}}
{{/unless}}
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 9f864c1be3e..7d3341fc560 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -465,7 +465,7 @@ class ApplicationController < ActionController::Base
# type - a machine-readable description of the error
# status - HTTP status code to return
def render_json_error(obj, opts={})
- opts = { status: opts } if opts.is_a?(Fixnum)
+ opts = { status: opts } if opts.is_a?(Integer)
render json: MultiJson.dump(create_errors_json(obj, opts[:type])), status: opts[:status] || 422
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index a9eaa127e11..d630da7442a 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -744,7 +744,7 @@ class UsersController < ApplicationController
result = {}
- %W{number_of_deleted_posts number_of_flagged_posts number_of_flags_given number_of_suspensions number_of_warnings}.each do |info|
+ %W{number_of_deleted_posts number_of_flagged_posts number_of_flags_given number_of_suspensions warnings_received_count}.each do |info|
result[info] = @user.send(info)
end
diff --git a/app/models/category.rb b/app/models/category.rb
index a533a3863fa..0a50c69d7d3 100644
--- a/app/models/category.rb
+++ b/app/models/category.rb
@@ -388,8 +388,8 @@ SQL
group = group.id if group.is_a?(Group)
# subtle, using Group[] ensures the group exists in the DB
- group = Group[group.to_sym].id unless group.is_a?(Fixnum)
- permission = CategoryGroup.permission_types[permission] unless permission.is_a?(Fixnum)
+ group = Group[group.to_sym].id unless group.is_a?(Integer)
+ permission = CategoryGroup.permission_types[permission] unless permission.is_a?(Integer)
[group, permission]
end
diff --git a/app/models/category_featured_user.rb b/app/models/category_featured_user.rb
index db524db0b89..fb75cca87b5 100644
--- a/app/models/category_featured_user.rb
+++ b/app/models/category_featured_user.rb
@@ -8,7 +8,7 @@ class CategoryFeaturedUser < ActiveRecord::Base
def self.feature_users_in(category_or_category_id)
category_id =
- if category_or_category_id.is_a?(Fixnum)
+ if category_or_category_id.is_a?(Integer)
category_or_category_id
else
category_or_category_id.id
diff --git a/app/models/draft_sequence.rb b/app/models/draft_sequence.rb
index 0e1c44359ef..af4eb647c93 100644
--- a/app/models/draft_sequence.rb
+++ b/app/models/draft_sequence.rb
@@ -1,7 +1,7 @@
class DraftSequence < ActiveRecord::Base
def self.next!(user,key)
user_id = user
- user_id = user.id unless user.class == Fixnum
+ user_id = user.id unless user.is_a?(Integer)
return 0 if user_id < 0
@@ -19,7 +19,7 @@ class DraftSequence < ActiveRecord::Base
return nil unless user
user_id = user
- user_id = user.id unless user.class == Fixnum
+ user_id = user.id unless user.is_a?(Integer)
# perf critical path
r = exec_sql('select sequence from draft_sequences where user_id = ? and draft_key = ?', user_id, key).values
diff --git a/app/models/plugin_store.rb b/app/models/plugin_store.rb
index ecf8d9c73e3..5a7675344ec 100644
--- a/app/models/plugin_store.rb
+++ b/app/models/plugin_store.rb
@@ -42,7 +42,7 @@ class PluginStore
def self.cast_value(type, value)
case type
- when "Fixnum" then value.to_i
+ when "Integer", "Fixnum" then value.to_i
when "TrueClass", "FalseClass" then value == "true"
when "JSON" then map_json(::JSON.parse(value))
else value
diff --git a/app/models/topic.rb b/app/models/topic.rb
index ed3844c121a..604c491284a 100644
--- a/app/models/topic.rb
+++ b/app/models/topic.rb
@@ -118,7 +118,7 @@ class Topic < ActiveRecord::Base
has_many :invites, through: :topic_invites, source: :invite
has_many :topic_status_updates, dependent: :destroy
- has_one :warning
+ has_one :user_warning
has_one :first_post, -> {where post_number: 1}, class_name: Post
# When we want to temporarily attach some data to a forum topic (usually before serialization)
diff --git a/app/models/user.rb b/app/models/user.rb
index 3c41e4c1e28..d47f6749cad 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -37,7 +37,7 @@ class User < ActiveRecord::Base
has_many :invites, dependent: :destroy
has_many :topic_links, dependent: :destroy
has_many :uploads
- has_many :warnings
+ has_many :user_warnings
has_many :user_archived_messages, dependent: :destroy
has_many :email_change_requests, dependent: :destroy
has_many :directory_items, dependent: :delete_all
@@ -276,7 +276,7 @@ class User < ActiveRecord::Base
def approve(approved_by, send_mail=true)
self.approved = true
- if approved_by.is_a?(Fixnum)
+ if approved_by.is_a?(Integer)
self.approved_by_id = approved_by
else
self.approved_by = approved_by
@@ -614,7 +614,7 @@ class User < ActiveRecord::Base
end
def warnings_received_count
- warnings.count
+ user_warnings.count
end
def flags_received_count
@@ -889,10 +889,6 @@ class User < ActiveRecord::Base
.count
end
- def number_of_warnings
- self.warnings.count
- end
-
def number_of_suspensions
UserHistory.for(self, :suspend_user).count
end
diff --git a/app/models/warning.rb b/app/models/user_warning.rb
similarity index 92%
rename from app/models/warning.rb
rename to app/models/user_warning.rb
index 0d177fb0c66..6bc201a7bc8 100644
--- a/app/models/warning.rb
+++ b/app/models/user_warning.rb
@@ -1,4 +1,4 @@
-class Warning < ActiveRecord::Base
+class UserWarning < ActiveRecord::Base
belongs_to :user
belongs_to :topic
belongs_to :created_by, class_name: 'User'
diff --git a/db/migrate/20170413043152_rename_warnings.rb b/db/migrate/20170413043152_rename_warnings.rb
new file mode 100644
index 00000000000..d4397726be8
--- /dev/null
+++ b/db/migrate/20170413043152_rename_warnings.rb
@@ -0,0 +1,9 @@
+class RenameWarnings < ActiveRecord::Migration
+ def up
+ rename_table :warnings, :user_warnings
+ end
+
+ def down
+ rename_table :user_warnings, :warnings
+ end
+end
diff --git a/lib/pretty_text/helpers.rb b/lib/pretty_text/helpers.rb
index 1c0c2f0e1a1..78378c5cbf7 100644
--- a/lib/pretty_text/helpers.rb
+++ b/lib/pretty_text/helpers.rb
@@ -45,7 +45,7 @@ module PrettyText
end
def get_topic_info(topic_id)
- return unless Fixnum === topic_id
+ return unless topic_id.is_a?(Integer)
# TODO this only handles public topics, secured one do not get this
topic = Topic.find_by(id: topic_id)
if topic && Guardian.new.can_see?(topic)
@@ -76,4 +76,3 @@ module PrettyText
end
end
end
-
diff --git a/lib/site_setting_extension.rb b/lib/site_setting_extension.rb
index 70e576f08de..20dd2818afc 100644
--- a/lib/site_setting_extension.rb
+++ b/lib/site_setting_extension.rb
@@ -23,7 +23,7 @@ module SiteSettingExtension
def types
@types ||= Enum.new(string: 1,
time: 2,
- fixnum: 3,
+ integer: 3,
float: 4,
bool: 5,
null: 6,
@@ -286,7 +286,7 @@ module SiteSettingExtension
val = (val == "t" || val == "true") ? 't' : 'f'
end
- if type == types[:fixnum] && !val.is_a?(Fixnum)
+ if type == types[:integer] && !val.is_a?(Integer)
val = val.to_i
end
@@ -295,7 +295,7 @@ module SiteSettingExtension
end
if type == types[:enum]
- val = val.to_i if defaults[name.to_sym].is_a?(Fixnum)
+ val = val.to_i if defaults[name.to_sym].is_a?(Integer)
if enum_class(name)
raise Discourse::InvalidParameters.new(:value) unless enum_class(name).valid_value?(val)
else
@@ -340,9 +340,9 @@ module SiteSettingExtension
valid = true
type = get_data_type(name, defaults[name.to_sym])
- if type == types[:fixnum]
- # validate fixnum
- valid = false unless value.to_i.is_a?(Fixnum)
+ if type == types[:integer]
+ # validate integer
+ valid = false unless value.to_i.is_a?(Integer)
end
valid
@@ -407,8 +407,8 @@ module SiteSettingExtension
case val
when String
types[:string]
- when Fixnum
- types[:fixnum]
+ when Integer
+ types[:integer]
when Float
types[:float]
when TrueClass, FalseClass
@@ -422,14 +422,14 @@ module SiteSettingExtension
case type
when types[:float]
value.to_f
- when types[:fixnum]
+ when types[:integer]
value.to_i
when types[:bool]
value == true || value == "t" || value == "true"
when types[:null]
nil
when types[:enum]
- defaults[name.to_sym].is_a?(Fixnum) ? value.to_i : value
+ defaults[name.to_sym].is_a?(Integer) ? value.to_i : value
else
return value if types[type]
# Otherwise it's a type error
@@ -441,7 +441,7 @@ module SiteSettingExtension
@validator_mapping ||= {
'email' => EmailSettingValidator,
'username' => UsernameSettingValidator,
- types[:fixnum] => IntegerSettingValidator,
+ types[:integer] => IntegerSettingValidator,
types[:string] => StringSettingValidator,
'list' => StringSettingValidator,
'enum' => StringSettingValidator,
diff --git a/lib/topic_creator.rb b/lib/topic_creator.rb
index 8c0621d507c..ecd35fd116b 100644
--- a/lib/topic_creator.rb
+++ b/lib/topic_creator.rb
@@ -64,7 +64,7 @@ class TopicCreator
rollback_with!(topic, :too_many_users) if @added_users.size != 1
# Create a warning record
- Warning.create(topic: topic, user: @added_users.first, created_by: @user)
+ UserWarning.create(topic: topic, user: @added_users.first, created_by: @user)
end
def watch_topic(topic)
diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb
index 3019c5a780f..5f0ea2fcf63 100644
--- a/spec/components/email/receiver_spec.rb
+++ b/spec/components/email/receiver_spec.rb
@@ -297,6 +297,8 @@ describe Email::Receiver do
end
it "supports attached images" do
+ SiteSetting.queue_jobs = true
+
expect { process(:no_body_with_image) }.to change { topic.posts.count }
expect(topic.posts.last.raw).to match(/https://www.eviltrout.com
")
end
diff --git a/spec/components/onebox/engine/discourse_local_onebox_spec.rb b/spec/components/onebox/engine/discourse_local_onebox_spec.rb
index 752eebc6e83..089c07a68bb 100644
--- a/spec/components/onebox/engine/discourse_local_onebox_spec.rb
+++ b/spec/components/onebox/engine/discourse_local_onebox_spec.rb
@@ -71,7 +71,7 @@ describe Onebox::Engine::DiscourseLocalOnebox do
it "returns nil if file type is not audio or video" do
url = "#{Discourse.base_url}#{path}.pdf"
- FakeWeb.register_uri(:get, url, body: "")
+ stub_request(:get, url).to_return(body: '')
expect(Onebox.preview(url).to_s).to eq("")
end
diff --git a/spec/components/oneboxer_spec.rb b/spec/components/oneboxer_spec.rb
index 1df8b30027f..a01449f21ee 100644
--- a/spec/components/oneboxer_spec.rb
+++ b/spec/components/oneboxer_spec.rb
@@ -4,9 +4,10 @@ require_dependency 'oneboxer'
describe Oneboxer do
it "returns blank string for an invalid onebox" do
+ stub_request(:get, "http://boom.com").to_return(body: "")
+
expect(Oneboxer.preview("http://boom.com")).to eq("")
expect(Oneboxer.onebox("http://boom.com")).to eq("")
end
end
-
diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb
index 9c9f915f524..d2ee5299cf0 100644
--- a/spec/components/post_creator_spec.rb
+++ b/spec/components/post_creator_spec.rb
@@ -255,6 +255,8 @@ describe PostCreator do
it 'creates a post with featured link' do
SiteSetting.topic_featured_link_enabled = true
SiteSetting.min_first_post_length = 100
+ SiteSetting.queue_jobs = true
+
post = creator_with_featured_link.create
expect(post.topic.featured_link).to eq('http://www.discourse.org')
expect(post.valid?).to eq(true)
@@ -585,7 +587,7 @@ describe PostCreator do
it 'acts correctly' do
# It's not a warning
- expect(post.topic.warning).to be_blank
+ expect(post.topic.user_warning).to be_blank
expect(post.topic.archetype).to eq(Archetype.private_message)
expect(post.topic.subtype).to eq(TopicSubtype.user_to_user)
@@ -657,11 +659,11 @@ describe PostCreator do
topic = post.topic
expect(topic).to be_present
- expect(topic.warning).to be_present
+ expect(topic.user_warning).to be_present
expect(topic.subtype).to eq(TopicSubtype.moderator_warning)
- expect(topic.warning.user).to eq(target_user1)
- expect(topic.warning.created_by).to eq(user)
- expect(target_user1.warnings.count).to eq(1)
+ expect(topic.user_warning.user).to eq(target_user1)
+ expect(topic.user_warning.created_by).to eq(user)
+ expect(target_user1.user_warnings.count).to eq(1)
end
end
diff --git a/spec/components/site_setting_extension_spec.rb b/spec/components/site_setting_extension_spec.rb
index e981f4fbf72..353c04bd4cd 100644
--- a/spec/components/site_setting_extension_spec.rb
+++ b/spec/components/site_setting_extension_spec.rb
@@ -58,7 +58,7 @@ describe SiteSettingExtension do
settings.hello = 100
expect(settings.hello).to eq(100)
- settings.provider.save(:hello, 99, SiteSetting.types[:fixnum] )
+ settings.provider.save(:hello, 99, SiteSetting.types[:integer] )
settings.refresh!
expect(settings.hello).to eq(99)
@@ -386,16 +386,6 @@ describe SiteSettingExtension do
end
end
- describe "set for an invalid fixnum value" do
- it "raises an error" do
- settings.setting(:test_setting, 80)
- settings.refresh!
- expect {
- settings.set("test_setting", 9999999999999999999)
- }.to raise_error(ArgumentError)
- end
- end
-
describe "filter domain name" do
before do
settings.setting(:white_listed_spam_host_domains, "www.example.com")
diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb
index 3dd88514a07..dc1b11c6034 100644
--- a/spec/controllers/uploads_controller_spec.rb
+++ b/spec/controllers/uploads_controller_spec.rb
@@ -75,12 +75,12 @@ describe UploadsController do
end
it 'is successful with synchronous api' do
- SiteSetting.stubs(:authorized_extensions).returns("*")
+ SiteSetting.authorized_extensions = "*"
controller.stubs(:is_api?).returns(true)
Jobs.expects(:enqueue).with(:create_thumbnails, anything)
- FakeWeb.register_uri(:get, "http://example.com/image.png", :body => File.read('spec/fixtures/images/logo.png'))
+ stub_request(:get, "http://example.com/image.png").to_return(body: File.read('spec/fixtures/images/logo.png'))
xhr :post, :create, url: 'http://example.com/image.png', type: "avatar", synchronous: true
diff --git a/spec/controllers/user_avatars_controller_spec.rb b/spec/controllers/user_avatars_controller_spec.rb
index d09bc36568f..603a60a441e 100644
--- a/spec/controllers/user_avatars_controller_spec.rb
+++ b/spec/controllers/user_avatars_controller_spec.rb
@@ -24,7 +24,7 @@ describe UserAvatarsController do
SiteSetting.s3_upload_bucket = "test"
SiteSetting.s3_cdn_url = "http://cdn.com"
- FakeWeb.register_uri(:get, "http://cdn.com/something/else", :body => 'image')
+ stub_request(:get, "http://cdn.com/something/else").to_return(body: 'image')
GlobalSetting.expects(:cdn_url).returns("http://awesome.com/boom")
diff --git a/spec/jobs/pull_hotlinked_images_spec.rb b/spec/jobs/pull_hotlinked_images_spec.rb
index aa9473a4783..bdae4fd3d4d 100644
--- a/spec/jobs/pull_hotlinked_images_spec.rb
+++ b/spec/jobs/pull_hotlinked_images_spec.rb
@@ -5,8 +5,9 @@ describe Jobs::PullHotlinkedImages do
before do
png = Base64.decode64("R0lGODlhAQABALMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//wBiZCH5BAEAAA8ALAAAAAABAAEAAAQC8EUAOw==")
- FakeWeb.register_uri(:get, "http://wiki.mozilla.org/images/2/2e/Longcat1.png", body: png)
+ stub_request(:get, "http://wiki.mozilla.org/images/2/2e/Longcat1.png").to_return(body: png)
SiteSetting.download_remote_images_to_local = true
+ FastImage.expects(:size).returns([100, 100]).at_least_once
end
it 'replaces image src' do
diff --git a/spec/jobs/update_gravatar_spec.rb b/spec/jobs/update_gravatar_spec.rb
index 0c80a3afcf6..bba53c724ab 100644
--- a/spec/jobs/update_gravatar_spec.rb
+++ b/spec/jobs/update_gravatar_spec.rb
@@ -8,7 +8,7 @@ describe Jobs::UpdateGravatar do
expect(user.user_avatar.gravatar_upload_id).to eq(nil)
png = Base64.decode64("R0lGODlhAQABALMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//wBiZCH5BAEAAA8ALAAAAAABAAEAAAQC8EUAOw==")
- FakeWeb.register_uri(:get, "http://www.gravatar.com/avatar/d10ca8d11301c2f4993ac2279ce4b930.png?s=500&d=404", body: png)
+ stub_request(:get, "http://www.gravatar.com/avatar/d10ca8d11301c2f4993ac2279ce4b930.png?s=360&d=404").to_return(body: png)
SiteSetting.automatically_download_gravatars = true
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 9409f66ae2c..8100e927820 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -1155,6 +1155,7 @@ describe User do
describe "refresh_avatar" do
it "enqueues the update_gravatar job when automatically downloading gravatars" do
SiteSetting.automatically_download_gravatars = true
+ SiteSetting.queue_jobs = true
user = Fabricate(:user)
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
index cc2ac9b91be..985bea4fb6e 100644
--- a/spec/rails_helper.rb
+++ b/spec/rails_helper.rb
@@ -9,17 +9,14 @@ require 'rbtrace'
#uncomment the following line to use spork with the debugger
#require 'spork/ext/ruby-debug'
-require 'fakeweb'
-FakeWeb.allow_net_connect = false
-
Spork.prefork do
# Loading more in this block will cause your tests to run faster. However,
# if you change any configuration or code from libraries loaded here, you'll
# need to restart spork for it take effect.
require 'fabrication'
require 'mocha/api'
- require 'fakeweb'
require 'certified'
+ require 'webmock/rspec'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)