workarea-core 3.4.30 → 3.4.35

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/workarea/bulk_action/product_edit.rb +6 -6
  3. data/app/models/workarea/search/admin/pricing_discount.rb +1 -1
  4. data/app/models/workarea/search/storefront/product/categories.rb +1 -1
  5. data/app/models/workarea/user/password_reset.rb +3 -1
  6. data/app/queries/workarea/search/pagination.rb +4 -1
  7. data/app/queries/workarea/search/storefront_search.rb +1 -1
  8. data/app/services/workarea/direct_upload.rb +17 -13
  9. data/app/services/workarea/hash_update.rb +18 -1
  10. data/app/workers/workarea/bulk_index_admin.rb +1 -1
  11. data/app/workers/workarea/bulk_index_products.rb +3 -2
  12. data/app/workers/workarea/bulk_index_searches.rb +4 -4
  13. data/app/workers/workarea/process_import.rb +3 -3
  14. data/lib/tasks/search.rake +10 -4
  15. data/lib/workarea/changelog.rake +1 -1
  16. data/lib/workarea/core.rb +3 -0
  17. data/lib/workarea/core/engine.rb +3 -4
  18. data/lib/workarea/elasticsearch/document.rb +15 -8
  19. data/lib/workarea/ext/freedom_patches/i18n_js.rb +27 -0
  20. data/lib/workarea/ext/freedom_patches/mongoid_localized_defaults.rb +25 -0
  21. data/lib/workarea/queues_pauser.rb +26 -0
  22. data/lib/workarea/version.rb +1 -1
  23. data/test/lib/workarea/elasticsearch/document_test.rb +20 -0
  24. data/test/lib/workarea/ext/freedom_patches/mongoid_localized_defaults_test.rb +25 -0
  25. data/test/models/workarea/user/password_reset_test.rb +12 -4
  26. data/test/queries/workarea/search/pagination_test.rb +9 -0
  27. data/test/queries/workarea/search/product_search_test.rb +16 -0
  28. data/test/services/workarea/direct_upload_test.rb +20 -3
  29. data/test/services/workarea/hash_update_test.rb +12 -12
  30. data/test/workers/workarea/process_import_test.rb +6 -0
  31. data/workarea-core.gemspec +3 -3
  32. metadata +12 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a0f1a32a380e8018ce48fa9c609e9cb820ccc1292c053101b4954caca8ae458
4
- data.tar.gz: e6f464bf2b5c443ba95403493f520e09fb8fda6457526486cf1084eabf2d6c7e
3
+ metadata.gz: b8b3b13aaa5cdef9ff862caeccdd738d6f094d405f67ab2e65bb76534b0eb84f
4
+ data.tar.gz: 84ef70baa8f39380254e2c9e763a81e6643726a5103c6d0b33255b51720b81a4
5
5
  SHA512:
6
- metadata.gz: 7959dc6060731296d8234a2d056955443f035f89b0d22ee61484bcba7751ec1198c0c040d4f30ab6f5359620f8b91e31523605a3ab0e7b13e12d48d5cbe32408
7
- data.tar.gz: 9cd1dea7985c3c5893deea11f9d913b2457837d0f609ca3ae4d94db0af39840ea214625bf2b1f9747e60336f09fd4e0dc8960e5eee7dddaf544e2bd0adeb7339
6
+ metadata.gz: 5c308fb6e8617c7f4fc819a42be2b5ae99d442093506c8846c62a146d6a911786d937e8e07ccd1d149b57aff2409b414943868cc35ba8d1a9c190a935fefe0da
7
+ data.tar.gz: 7c740a240da58b656345c601741309ff2af41a5571c29d5162d20a122a91a14844967c1254edf1a992f4597fd1d560a8c72150236e2c4effcd465cee571eea8d
@@ -36,15 +36,15 @@ module Workarea
36
36
  end
37
37
 
38
38
  def apply_details!(product)
39
- HashUpdate
40
- .new(adds: add_details, removes: remove_details)
41
- .apply(product.details)
39
+ product.details = HashUpdate
40
+ .new(original: product.details, adds: add_details, removes: remove_details)
41
+ .result
42
42
  end
43
43
 
44
44
  def apply_filters!(product)
45
- HashUpdate
46
- .new(adds: add_filters, removes: remove_filters)
47
- .apply(product.filters)
45
+ product.filters = HashUpdate
46
+ .new(original: product.filters, adds: add_filters, removes: remove_filters)
47
+ .result
48
48
  end
49
49
 
50
50
  def apply_pricing!(product)
@@ -21,7 +21,7 @@ module Workarea
21
21
  end
22
22
 
23
23
  def keywords
24
- super + model.promo_codes
24
+ super + Array.wrap(model.try(:promo_codes))
25
25
  end
26
26
 
27
27
  def facets
@@ -13,7 +13,7 @@ module Workarea
13
13
  if category.product_rules.present?
14
14
  document = {
15
15
  id: category.id,
16
- query: Categorization.new(rules: category.product_rules).query
16
+ query: Workarea::Search::Categorization.new(rules: category.product_rules).query
17
17
  }
18
18
 
19
19
  Storefront.current_index.save(document, type: 'category')
@@ -4,7 +4,7 @@ module Workarea
4
4
  include ApplicationDocument
5
5
  include UrlToken
6
6
 
7
- belongs_to :user, class_name: 'Workarea::User'
7
+ belongs_to :user, class_name: 'Workarea::User', index: true
8
8
 
9
9
  index(
10
10
  { created_at: 1 },
@@ -14,6 +14,8 @@ module Workarea
14
14
  def self.setup!(email)
15
15
  user = User.find_by_email(email)
16
16
  return nil unless user
17
+
18
+ where(user_id: user.id).destroy_all
17
19
  create!(user: user)
18
20
  end
19
21
 
@@ -7,7 +7,10 @@ module Workarea
7
7
  end
8
8
 
9
9
  def per_page
10
- params[:per_page].presence || Workarea.config.per_page
10
+ return Workarea.config.per_page if params[:per_page].blank?
11
+
12
+ tmp = params[:per_page].to_i
13
+ tmp > 0 ? tmp : Workarea.config.per_page
11
14
  end
12
15
 
13
16
  def size
@@ -4,7 +4,7 @@ module Workarea
4
4
  attr_reader :params
5
5
 
6
6
  def initialize(params)
7
- @params = params
7
+ @params = params.with_indifferent_access.except(:per_page)
8
8
  @used_middleware = []
9
9
  end
10
10
 
@@ -6,22 +6,26 @@ module Workarea
6
6
  uri = URI.parse(request_url)
7
7
  url = "#{uri.scheme}://#{uri.host}"
8
8
  url += ":#{uri.port}" unless uri.port.in? [80, 443]
9
+ id = "direct_upload_#{url}"
9
10
 
10
- redis_key = "cors_#{url.optionize}"
11
- return if Workarea.redis.get(redis_key) == 'true'
11
+ response = begin
12
+ Workarea.s3.get_bucket_cors(Configuration::S3.bucket)
13
+ rescue Excon::Error::NotFound
14
+ Excon::Response.new(body: { 'CORSConfiguration' => [] })
15
+ end
12
16
 
13
- response = Workarea.s3.get_bucket_cors(Configuration::S3.bucket)
14
17
  cors = response.data[:body]
15
- cors['CORSConfiguration'] << {
16
- 'ID' => "direct_upload_#{url}",
17
- 'AllowedMethod' => 'PUT',
18
- 'AllowedOrigin' => url,
19
- 'AllowedHeader' => '*'
20
- }
21
- cors['CORSConfiguration'].uniq!
22
-
23
- Workarea.s3.put_bucket_cors(Configuration::S3.bucket, cors)
24
- Workarea.redis.set(redis_key, 'true')
18
+
19
+ unless cors['CORSConfiguration'].pluck('ID').include?(id)
20
+ cors['CORSConfiguration'] << {
21
+ 'ID' => id,
22
+ 'AllowedMethod' => 'PUT',
23
+ 'AllowedOrigin' => url,
24
+ 'AllowedHeader' => '*'
25
+ }
26
+
27
+ Workarea.s3.put_bucket_cors(Configuration::S3.bucket, cors)
28
+ end
25
29
  end
26
30
 
27
31
  attr_reader :type, :filename
@@ -5,13 +5,30 @@ module Workarea
5
5
  parsed.map(&:to_s).map(&:strip).reject(&:blank?) if parsed.present?
6
6
  end
7
7
 
8
- def initialize(adds: [], updates: [], removes: [])
8
+ def initialize(original: {}, adds: [], updates: [], removes: [])
9
+ @original = original
9
10
  @adds = Array(adds).flatten.each_slice(2).to_a
10
11
  @updates = Array(updates).flatten.each_slice(2).to_a
11
12
  @removes = Array(removes).flatten
12
13
  end
13
14
 
15
+ def result
16
+ apply_to(@original.deep_dup)
17
+ end
18
+
19
+ # TODO v3.6 remove this method, doesn't work when the field is localized
20
+ # @deprecated
14
21
  def apply(hash)
22
+ warn <<~eos
23
+ [DEPRECATION] `HashUpdate#apply` is deprecated and will be removed in
24
+ version 3.6.0. Please use `HashUpdate#result` instead.
25
+ eos
26
+ apply_to(hash)
27
+ end
28
+
29
+ private
30
+
31
+ def apply_to(hash)
15
32
  @adds.each do |tuple|
16
33
  key, value = *tuple
17
34
  hash[key] = self.class.parse_values(value)
@@ -13,7 +13,7 @@ module Workarea
13
13
 
14
14
  def perform_by_models(models)
15
15
  return if models.empty?
16
- Workarea::Search::Admin.bulk(documents_for(models))
16
+ Workarea::Search::Admin.bulk { documents_for(models) }
17
17
  end
18
18
 
19
19
  private
@@ -14,9 +14,10 @@ module Workarea
14
14
  def perform_by_models(products)
15
15
  return if products.blank?
16
16
 
17
- documents = Search::ProductEntries.new(products).map(&:as_bulk_document)
17
+ Search::Storefront.bulk do
18
+ Search::ProductEntries.new(products).map(&:as_bulk_document)
19
+ end
18
20
 
19
- Search::Storefront.bulk(documents)
20
21
  products.each { |p| p.set(last_indexed_at: Time.current) }
21
22
  end
22
23
  end
@@ -18,11 +18,11 @@ module Workarea
18
18
  end
19
19
 
20
20
  def perform_by_models(searches)
21
- documents = searches.map do |model|
22
- Search::Storefront::Search.new(model).as_bulk_document
21
+ Search::Storefront.bulk do
22
+ searches.map do |model|
23
+ Search::Storefront::Search.new(model).as_bulk_document
24
+ end
23
25
  end
24
-
25
- Search::Storefront.bulk(documents)
26
26
  end
27
27
  end
28
28
 
@@ -17,11 +17,11 @@ module Workarea
17
17
  import.process!
18
18
 
19
19
  ensure
20
- if import.error?
20
+ if import&.error?
21
21
  Admin::DataFileMailer.import_error(id).deliver_now
22
- elsif import.failure?
22
+ elsif import&.failure?
23
23
  Admin::DataFileMailer.import_failure(id).deliver_now
24
- else
24
+ elsif import.present?
25
25
  Admin::DataFileMailer.import(id).deliver_now
26
26
  end
27
27
  end
@@ -12,7 +12,9 @@ namespace :workarea do
12
12
  require 'sidekiq/testing/inline' unless ENV['INLINE'] == 'false'
13
13
  puts 'Indexing admin...'
14
14
 
15
- Workarea::Search::Admin.reset_indexes!
15
+ Workarea::QueuesPauser.with_paused_queues do
16
+ Workarea::Search::Admin.reset_indexes!
17
+ end
16
18
 
17
19
  Mongoid.models.each do |klass|
18
20
  next unless Workarea::Search::Admin.for(klass.first).present?
@@ -32,8 +34,10 @@ namespace :workarea do
32
34
  require 'sidekiq/testing/inline' unless ENV['INLINE'] == 'false'
33
35
  puts 'Indexing storefront...'
34
36
 
35
- Workarea::Search::Storefront.reset_indexes!
36
- Workarea::Search::Storefront.ensure_dynamic_mappings
37
+ Workarea::QueuesPauser.with_paused_queues do
38
+ Workarea::Search::Storefront.reset_indexes!
39
+ Workarea::Search::Storefront.ensure_dynamic_mappings
40
+ end
37
41
 
38
42
  # This code finds all unique filters for products so we can index a sample
39
43
  # product for each to ensure the dynamic mappings get created.
@@ -79,7 +83,9 @@ namespace :workarea do
79
83
  require 'sidekiq/testing/inline' unless ENV['INLINE'] == 'false'
80
84
  puts 'Indexing help...'
81
85
 
82
- Workarea::Search::Help.reset_indexes!
86
+ Workarea::QueuesPauser.with_paused_queues do
87
+ Workarea::Search::Help.reset_indexes!
88
+ end
83
89
 
84
90
  Workarea::Help::Article.all.each_by(100) do |help_article|
85
91
  Workarea::Search::Help.new(help_article).save
@@ -67,7 +67,7 @@ namespace :workarea do
67
67
  message << " #{line.strip}"
68
68
  end
69
69
  end
70
- message << " #{entry[:author]}\n"
70
+ message << "\n #{entry[:author]}\n"
71
71
  end
72
72
 
73
73
  # ensure and append to changelog
@@ -126,6 +126,8 @@ require 'workarea/ext/freedom_patches/country'
126
126
  require 'workarea/ext/freedom_patches/net_http_ssl_connection'
127
127
  require 'workarea/ext/freedom_patches/dragonfly_job_fetch_url'
128
128
  require 'workarea/ext/freedom_patches/dragonfly_callable_url_host'
129
+ require 'workarea/ext/freedom_patches/mongoid_localized_defaults'
130
+ require 'workarea/ext/freedom_patches/i18n_js'
129
131
  require 'workarea/ext/mongoid/list_field'
130
132
  require 'workarea/ext/mongoid/each_by'
131
133
  require 'workarea/ext/mongoid/except'
@@ -206,6 +208,7 @@ require 'workarea/cache'
206
208
  require 'workarea/scheduled_jobs'
207
209
  require 'workarea/string_id'
208
210
  require 'workarea/mail_interceptor'
211
+ require 'workarea/queues_pauser'
209
212
 
210
213
  #
211
214
  # Engines
@@ -118,13 +118,12 @@ db.getSiblingDB("admin").runCommand( { setParameter: 1, notablescan: 0 } )
118
118
  **************************************************
119
119
  ⛔️ WARNING: Dragonfly is configured to use the filesystem.
120
120
 
121
- This means all dragonfly assets (assets, product images, etc.) will be stored
121
+ This means all Dragonfly assets (assets, product images, etc.) will be stored
122
122
  locally and not accessible to all servers within your environment.
123
123
 
124
124
  We recommend using S3 when running in a live environment by setting
125
- WORKAREA_S3_REGION and WORKAREA_S3_BUCKET_NAME in your environment variables.
126
- Workarea will automatically configure Dragonfly to use S3 if those values
127
- are present.
125
+ WORKAREA_S3_REGION and WORKAREA_S3_BUCKET_NAME in your environment variables,
126
+ and setting `Workarea.config.asset_store = :s3` in an initializer.
128
127
  **************************************************
129
128
  eos
130
129
  end
@@ -44,22 +44,27 @@ module Workarea
44
44
 
45
45
  def save(document, options = {})
46
46
  options = options.merge(type: type)
47
- I18n.for_each_locale { current_index.save(document, options) }
47
+ current_index.save(document, options)
48
48
  end
49
49
 
50
- def bulk(documents, options = {})
50
+ def bulk(documents = [], options = {})
51
51
  options = options.merge(type: type)
52
- I18n.for_each_locale { current_index.bulk(documents, options) }
52
+
53
+ if block_given?
54
+ I18n.for_each_locale { current_index.bulk(Array.wrap(yield), options) }
55
+ else
56
+ current_index.bulk(documents, options)
57
+ end
53
58
  end
54
59
 
55
60
  def update(document, options = {})
56
61
  options = options.merge(type: type)
57
- I18n.for_each_locale { current_index.update(document, options) }
62
+ current_index.update(document, options)
58
63
  end
59
64
 
60
65
  def delete(id, options = {})
61
66
  options = options.merge(type: type)
62
- I18n.for_each_locale { current_index.delete(id, options) }
67
+ current_index.delete(id, options)
63
68
  end
64
69
 
65
70
  def count(query = nil, options = {})
@@ -97,12 +102,14 @@ module Workarea
97
102
  end
98
103
 
99
104
  def save(options = {})
100
- document = as_document.merge(Serializer.serialize(model))
101
- self.class.save(document, options)
105
+ I18n.for_each_locale do
106
+ document = as_document.merge(Serializer.serialize(model))
107
+ self.class.save(document, options)
108
+ end
102
109
  end
103
110
 
104
111
  def destroy(options = {})
105
- self.class.delete(id, options)
112
+ I18n.for_each_locale { self.class.delete(id, options) }
106
113
  end
107
114
  end
108
115
  end
@@ -0,0 +1,27 @@
1
+ module I18n
2
+ module JS
3
+ class FallbackLocales
4
+ # i18n-js uses just the second part of this check out-of-the-box. This
5
+ # causes the I18n fallbacks to get autoloaded without the developer
6
+ # knowing.
7
+ #
8
+ # This surfaces in tests. System or integration tests will do this check
9
+ # for compiling assets, then I18n fallbacks get autoloaded. So this shows
10
+ # as some tests not having fallbacks if they run before one of those tests
11
+ # or magically having fallbacks if they run after one of those types of
12
+ # tests.
13
+ #
14
+ # Adding the `respond_to?` check doesn't cause autoload, but will return
15
+ # `true` if fallbacks are enabled. Retain the original check because we
16
+ # want the current I18n::JS backend to be checked, once fallbacks are
17
+ # `require`d `I18n.respond_to?(:fallbacks)` will always return `true`.
18
+ #
19
+ # See also: https://github.com/fnando/i18n-js/blob/master/lib/i18n/js/fallback_locales.rb#L49-L58
20
+ #
21
+ def using_i18n_fallbacks_module?
22
+ I18n.respond_to?(:fallbacks) &&
23
+ I18n::JS.backend.class.included_modules.include?(I18n::Backend::Fallbacks)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,25 @@
1
+ module Mongoid
2
+ module Fields
3
+ module LocalizedDefaults
4
+ def create_accessors(name, meth, options = {})
5
+ super
6
+
7
+ if options[:localize]
8
+ field = fields[name]
9
+
10
+ define_method meth do |*args|
11
+ result = super(*args)
12
+ return result unless result.nil?
13
+
14
+ default_name = field.send(:default_name)
15
+ return send(default_name) if respond_to?(default_name)
16
+
17
+ field.default_val
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ ClassMethods.prepend(LocalizedDefaults)
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ module Workarea
2
+ module QueuesPauser
3
+ extend self
4
+
5
+ def pause_queues!
6
+ pauser = Sidekiq::Throttled::QueuesPauser.instance
7
+ queues.each { |queue| pauser.pause!(queue) }
8
+ end
9
+
10
+ def resume_queues!
11
+ pauser = Sidekiq::Throttled::QueuesPauser.instance
12
+ queues.each { |queue| pauser.resume!(queue) }
13
+ end
14
+
15
+ def with_paused_queues(&block)
16
+ pause_queues!
17
+ yield
18
+ ensure
19
+ resume_queues!
20
+ end
21
+
22
+ def queues
23
+ Configuration::Sidekiq.queues
24
+ end
25
+ end
26
+ end
@@ -2,7 +2,7 @@ module Workarea
2
2
  module VERSION
3
3
  MAJOR = 3
4
4
  MINOR = 4
5
- PATCH = 30
5
+ PATCH = 35
6
6
  PRE = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
@@ -67,6 +67,26 @@ module Workarea
67
67
  assert_equal({ 'id' => '1' }, results.first['_source'])
68
68
  end
69
69
 
70
+ def test_bulk_with_block
71
+ set_locales(available: [:en, :es], default: :en, current: :en)
72
+ Foo.bulk { { id: I18n.locale.to_s, bulk_action: 'index' } }
73
+
74
+ find_results = -> do
75
+ Foo
76
+ .current_index
77
+ .search({ query: { match_all: {} } }, type: 'foo')
78
+ .dig('hits', 'hits')
79
+ end
80
+
81
+ I18n.locale = :en
82
+ assert(1, Foo.count)
83
+ assert_equal({ 'id' => 'en' }, find_results.call.first['_source'])
84
+
85
+ I18n.locale = :es
86
+ assert(1, Foo.count)
87
+ assert_equal({ 'id' => 'es' }, find_results.call.first['_source'])
88
+ end
89
+
70
90
  def test_update
71
91
  Foo.save(id: '1')
72
92
  Foo.update(id: '1', foo: 'bar')
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class MongoidLocalizedDefaultsTest < TestCase
5
+ class Foo
6
+ include Mongoid::Document
7
+
8
+ field :name, type: String, default: -> { 'foo' }, localize: true
9
+ field :config, type: Hash, default: { foo: 'bar' }, localize: true
10
+ end
11
+
12
+ def test_localized_defaults
13
+ set_locales(available: [:en, :es], default: :en, current: :en)
14
+
15
+ instance = Foo.new
16
+ assert_equal('foo', instance.name)
17
+ assert_equal({ foo: 'bar' }, instance.config)
18
+
19
+ I18n.locale = :es
20
+
21
+ assert_equal('foo', instance.name)
22
+ assert_equal({ foo: 'bar' }, instance.config)
23
+ end
24
+ end
25
+ end
@@ -4,14 +4,22 @@ module Workarea
4
4
  class User
5
5
  class PasswordResetTest < TestCase
6
6
  def user
7
- @user ||= create_user
7
+ @user ||= create_user(email: 'one@workarea.com')
8
8
  end
9
9
 
10
10
  def test_setup!
11
- PasswordReset.setup!(user.email)
11
+ 2.times do
12
+ PasswordReset.setup!(user.email)
12
13
 
13
- assert_equal(1, PasswordReset.count)
14
- assert_equal(user.id, PasswordReset.first.user_id)
14
+ assert_equal(1, PasswordReset.count)
15
+ assert_equal(user.id, PasswordReset.first.user_id)
16
+ end
17
+
18
+ two = create_user(email: 'two@workarea.com')
19
+ PasswordReset.setup!('two@workarea.com')
20
+
21
+ assert_equal(2, PasswordReset.count)
22
+ assert_equal(two.id, PasswordReset.last.user_id)
15
23
  end
16
24
 
17
25
  def test_complete
@@ -19,6 +19,15 @@ module Workarea
19
19
  assert_equal(1, Paginate.new(page: 'asdf').page)
20
20
  end
21
21
 
22
+ def test_per_page
23
+ assert_equal(Workarea.config.per_page, Paginate.new.per_page)
24
+ assert_equal(2, Paginate.new(per_page: 2).per_page)
25
+ assert_equal(Workarea.config.per_page, Paginate.new(per_page: -1).per_page)
26
+ assert_equal(Workarea.config.per_page, Paginate.new(per_page: 0).per_page)
27
+ assert_equal(3, Paginate.new(per_page: '3').per_page)
28
+ assert_equal(Workarea.config.per_page, Paginate.new(per_page: 'asdf').per_page)
29
+ end
30
+
22
31
  def test_from
23
32
  Workarea.with_config do |config|
24
33
  config.per_page = 30
@@ -408,6 +408,22 @@ module Workarea
408
408
  assert(result[:raw].present?)
409
409
  assert_kind_of(Float, result[:raw]['_score'])
410
410
  end
411
+
412
+ def test_locale
413
+ # No simple way to run this test without fallbacks or localized fields
414
+ return unless Workarea.config.localized_active_fields
415
+
416
+ set_locales(available: [:en, :es], default: :en, current: :en)
417
+ Search::Storefront.reset_indexes!
418
+
419
+ product = create_product(active_translations: { 'en' => true, 'es' => false })
420
+
421
+ I18n.locale = :es
422
+ assert_equal([], ProductSearch.new(q: '*').results.pluck(:model))
423
+
424
+ I18n.locale = :en
425
+ assert_equal([product], ProductSearch.new(q: '*').results.pluck(:model))
426
+ end
411
427
  end
412
428
  end
413
429
  end
@@ -108,11 +108,28 @@ module Workarea
108
108
  ).returns(true)
109
109
 
110
110
  assert(DirectUpload.ensure_cors!('http://test.host/admin/content_assets'))
111
- assert_equal('true', Workarea.redis.get('cors_http_test_host'))
112
111
  assert(DirectUpload.ensure_cors!('http://localhost:3000/admin/content_assets'))
113
- assert_equal('true', Workarea.redis.get('cors_http_localhost_3000'))
114
112
  assert(DirectUpload.ensure_cors!('https://example.com/admin/direct_uploads'))
115
- assert_equal('true', Workarea.redis.get('cors_https_example_com'))
113
+ end
114
+
115
+ def test_ensure_cors_with_no_existing_configuration
116
+ Workarea.s3.expects(:get_bucket_cors)
117
+ .raises(Excon::Errors::NotFound.new('CORS configuration does not exist'))
118
+
119
+
120
+ Workarea.s3.expects(:put_bucket_cors).with(
121
+ Configuration::S3.bucket,
122
+ 'CORSConfiguration' => [
123
+ {
124
+ 'ID' => "direct_upload_http://test.host",
125
+ 'AllowedMethod' => 'PUT',
126
+ 'AllowedOrigin' => 'http://test.host',
127
+ 'AllowedHeader' => '*'
128
+ }
129
+ ]
130
+ ).returns(true)
131
+
132
+ assert(DirectUpload.ensure_cors!('http://test.host/admin/content_assets'))
116
133
  end
117
134
 
118
135
  private
@@ -2,23 +2,23 @@ require 'test_helper'
2
2
 
3
3
  module Workarea
4
4
  class HashUpdateTest < TestCase
5
- def test_apply
6
- hash = { 'foo' => 'bar' }
5
+ def test_result
6
+ original = { 'foo' => 'bar' }
7
7
 
8
- HashUpdate.new(adds: %w(key value)).apply(hash)
9
- assert_equal(%w(value), hash['key'])
8
+ result = HashUpdate.new(original: original, adds: %w(key value)).result
9
+ assert_equal(%w(value), result['key'])
10
10
 
11
- HashUpdate.new(updates: %w(foo baz)).apply(hash)
12
- assert_equal(%w(baz), hash['foo'])
11
+ result = HashUpdate.new(original: original, updates: %w(foo baz)).result
12
+ assert_equal(%w(baz), result['foo'])
13
13
 
14
- HashUpdate.new(removes: %w(foo)).apply(hash)
15
- refute_includes(hash.keys, 'foo')
14
+ result = HashUpdate.new(original: original, removes: %w(foo)).result
15
+ refute_includes(result.keys, 'foo')
16
16
 
17
- HashUpdate.new(adds: ['key', 'one, two ']).apply(hash)
18
- assert_equal(%w(one two), hash['key'])
17
+ result = HashUpdate.new(original: original, adds: ['key', 'one, two ']).result
18
+ assert_equal(%w(one two), result['key'])
19
19
 
20
- HashUpdate.new(updates: ['key', 'one, two, three ']).apply(hash)
21
- assert_equal(%w(one two three), hash['key'])
20
+ result = HashUpdate.new(original: original, updates: ['key', 'one, two, three ']).result
21
+ assert_equal(%w(one two three), result['key'])
22
22
  end
23
23
  end
24
24
  end
@@ -53,5 +53,11 @@ module Workarea
53
53
  t('workarea.admin.data_file_mailer.import_failure.errors')
54
54
  )
55
55
  end
56
+
57
+ def test_perform_with_missing_import
58
+ assert_raises Mongoid::Errors::DocumentNotFound do
59
+ ProcessImport.new.perform('foo')
60
+ end
61
+ end
56
62
  end
57
63
  end
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
  s.add_dependency 'mongoid-tree', '~> 2.1.0'
25
25
  s.add_dependency 'mongoid-sample', '~> 0.1.0'
26
26
  s.add_dependency 'elasticsearch', '~> 5.0.1'
27
- s.add_dependency 'kaminari', '~> 0.17.0'
27
+ s.add_dependency 'kaminari', '~> 1.2.1'
28
28
  s.add_dependency 'kaminari-mongoid', '~> 0.1.2'
29
29
  s.add_dependency 'activemerchant', '~> 1.52'
30
30
  s.add_dependency 'dragonfly', '~> 1.1.2'
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
32
32
  s.add_dependency 'sidekiq-cron', '~> 0.6.3'
33
33
  s.add_dependency 'sidekiq-unique-jobs', '~> 6.0.6'
34
34
  s.add_dependency 'sidekiq-throttled', '~> 0.8.2'
35
- s.add_dependency 'geocoder', '~> 1.4.4'
35
+ s.add_dependency 'geocoder', '~> 1.6.3'
36
36
  s.add_dependency 'redis-rails', '~> 5.0.0'
37
37
  s.add_dependency 'redis-rack-cache', '~> 2.2.0'
38
38
  s.add_dependency 'easymon', '~> 1.4.0'
@@ -65,7 +65,7 @@ Gem::Specification.new do |s|
65
65
  s.add_dependency 'chart-horizontalbar-rails', '~> 1.0.4' # TODO remove v4
66
66
  s.add_dependency 'select2-rails', '~> 4.0.3'
67
67
  s.add_dependency 'wysihtml-rails', '~> 0.6.0.beta2'
68
- s.add_dependency 'rack-attack', '~> 5.0.1'
68
+ s.add_dependency 'rack-attack', '~> 6.3.1'
69
69
  s.add_dependency 'jquery-livetype-rails', '~> 0.1.0' # TODO remove v4
70
70
  s.add_dependency 'redcarpet', '~> 3.4.0'
71
71
  s.add_dependency 'jquery-unique-clone-rails', '~> 1.0.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workarea-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.30
4
+ version: 3.4.35
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Crouse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-31 00:00:00.000000000 Z
11
+ date: 2020-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -156,14 +156,14 @@ dependencies:
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 0.17.0
159
+ version: 1.2.1
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: 0.17.0
166
+ version: 1.2.1
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: kaminari-mongoid
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -268,14 +268,14 @@ dependencies:
268
268
  requirements:
269
269
  - - "~>"
270
270
  - !ruby/object:Gem::Version
271
- version: 1.4.4
271
+ version: 1.6.3
272
272
  type: :runtime
273
273
  prerelease: false
274
274
  version_requirements: !ruby/object:Gem::Requirement
275
275
  requirements:
276
276
  - - "~>"
277
277
  - !ruby/object:Gem::Version
278
- version: 1.4.4
278
+ version: 1.6.3
279
279
  - !ruby/object:Gem::Dependency
280
280
  name: redis-rails
281
281
  requirement: !ruby/object:Gem::Requirement
@@ -730,14 +730,14 @@ dependencies:
730
730
  requirements:
731
731
  - - "~>"
732
732
  - !ruby/object:Gem::Version
733
- version: 5.0.1
733
+ version: 6.3.1
734
734
  type: :runtime
735
735
  prerelease: false
736
736
  version_requirements: !ruby/object:Gem::Requirement
737
737
  requirements:
738
738
  - - "~>"
739
739
  - !ruby/object:Gem::Version
740
- version: 5.0.1
740
+ version: 6.3.1
741
741
  - !ruby/object:Gem::Dependency
742
742
  name: jquery-livetype-rails
743
743
  requirement: !ruby/object:Gem::Requirement
@@ -1855,7 +1855,9 @@ files:
1855
1855
  - lib/workarea/ext/freedom_patches/dragonfly_job_fetch_url.rb
1856
1856
  - lib/workarea/ext/freedom_patches/float.rb
1857
1857
  - lib/workarea/ext/freedom_patches/global_id.rb
1858
+ - lib/workarea/ext/freedom_patches/i18n_js.rb
1858
1859
  - lib/workarea/ext/freedom_patches/money.rb
1860
+ - lib/workarea/ext/freedom_patches/mongoid_localized_defaults.rb
1859
1861
  - lib/workarea/ext/freedom_patches/mongoid_simple_tags.rb
1860
1862
  - lib/workarea/ext/freedom_patches/net_http_ssl_connection.rb
1861
1863
  - lib/workarea/ext/freedom_patches/routes_reloader.rb
@@ -1893,6 +1895,7 @@ files:
1893
1895
  - lib/workarea/ping_home_base.rb
1894
1896
  - lib/workarea/plugin.rb
1895
1897
  - lib/workarea/plugin/asset_appends_helper.rb
1898
+ - lib/workarea/queues_pauser.rb
1896
1899
  - lib/workarea/robots.rb
1897
1900
  - lib/workarea/routes_constraints/redirect.rb
1898
1901
  - lib/workarea/routes_constraints/super_admin.rb
@@ -2006,6 +2009,7 @@ files:
2006
2009
  - test/lib/workarea/ext/freedom_patches/country_test.rb
2007
2010
  - test/lib/workarea/ext/freedom_patches/dragonfly_callable_url_host_test.rb
2008
2011
  - test/lib/workarea/ext/freedom_patches/global_id_test.rb
2012
+ - test/lib/workarea/ext/freedom_patches/mongoid_localized_defaults_test.rb
2009
2013
  - test/lib/workarea/ext/freedom_patches/mongoid_simple_tags_test.rb
2010
2014
  - test/lib/workarea/ext/mongoid/audit_log_entry_test.rb
2011
2015
  - test/lib/workarea/ext/mongoid/each_by_test.rb