chore: Update dependencies to the latest versions (#5033)
This commit is contained in:
parent
ea1a27c7d4
commit
4187428729
122 changed files with 546 additions and 526 deletions
|
@ -93,15 +93,18 @@ jobs:
|
||||||
- run: bundle exec rake db:create
|
- run: bundle exec rake db:create
|
||||||
- run: bundle exec rake db:schema:load
|
- run: bundle exec rake db:schema:load
|
||||||
|
|
||||||
# disable till fixed
|
- run:
|
||||||
# - run:
|
name: Bundle audit
|
||||||
# name: Bundle audit
|
command: bundle exec bundle audit update && bundle exec bundle audit check -v
|
||||||
# command: bundle exec bundle audit update && bundle exec bundle audit check -v
|
|
||||||
|
|
||||||
- run:
|
- run:
|
||||||
name: Rubocop
|
name: Rubocop
|
||||||
command: bundle exec rubocop
|
command: bundle exec rubocop
|
||||||
|
|
||||||
|
# - run:
|
||||||
|
# name: Brakeman
|
||||||
|
# command: bundle exec brakeman
|
||||||
|
|
||||||
- run:
|
- run:
|
||||||
name: eslint
|
name: eslint
|
||||||
command: yarn run eslint
|
command: yarn run eslint
|
||||||
|
|
9
Gemfile
9
Gemfile
|
@ -4,7 +4,7 @@ ruby '3.0.4'
|
||||||
|
|
||||||
##-- base gems for rails --##
|
##-- base gems for rails --##
|
||||||
gem 'rack-cors', require: 'rack/cors'
|
gem 'rack-cors', require: 'rack/cors'
|
||||||
gem 'rails'
|
gem 'rails', '~>6.1'
|
||||||
# Reduces boot times through caching; required in config/boot.rb
|
# Reduces boot times through caching; required in config/boot.rb
|
||||||
gem 'bootsnap', require: false
|
gem 'bootsnap', require: false
|
||||||
|
|
||||||
|
@ -89,10 +89,6 @@ gem 'slack-ruby-client'
|
||||||
# for dialogflow integrations
|
# for dialogflow integrations
|
||||||
gem 'google-cloud-dialogflow'
|
gem 'google-cloud-dialogflow'
|
||||||
|
|
||||||
##--- gems for debugging and error reporting ---##
|
|
||||||
# static analysis
|
|
||||||
gem 'brakeman'
|
|
||||||
|
|
||||||
##-- apm and error monitoring ---#
|
##-- apm and error monitoring ---#
|
||||||
gem 'ddtrace'
|
gem 'ddtrace'
|
||||||
gem 'newrelic_rpm'
|
gem 'newrelic_rpm'
|
||||||
|
@ -160,6 +156,9 @@ end
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
gem 'active_record_query_trace'
|
gem 'active_record_query_trace'
|
||||||
|
##--- gems for debugging and error reporting ---##
|
||||||
|
# static analysis
|
||||||
|
gem 'brakeman'
|
||||||
gem 'bundle-audit', require: false
|
gem 'bundle-audit', require: false
|
||||||
gem 'byebug', platform: :mri
|
gem 'byebug', platform: :mri
|
||||||
gem 'climate_control'
|
gem 'climate_control'
|
||||||
|
|
405
Gemfile.lock
405
Gemfile.lock
|
@ -9,63 +9,63 @@ GIT
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
actioncable (6.1.5.1)
|
actioncable (6.1.6.1)
|
||||||
actionpack (= 6.1.5.1)
|
actionpack (= 6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
actionmailbox (6.1.5.1)
|
actionmailbox (6.1.6.1)
|
||||||
actionpack (= 6.1.5.1)
|
actionpack (= 6.1.6.1)
|
||||||
activejob (= 6.1.5.1)
|
activejob (= 6.1.6.1)
|
||||||
activerecord (= 6.1.5.1)
|
activerecord (= 6.1.6.1)
|
||||||
activestorage (= 6.1.5.1)
|
activestorage (= 6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.7.1)
|
||||||
actionmailer (6.1.5.1)
|
actionmailer (6.1.6.1)
|
||||||
actionpack (= 6.1.5.1)
|
actionpack (= 6.1.6.1)
|
||||||
actionview (= 6.1.5.1)
|
actionview (= 6.1.6.1)
|
||||||
activejob (= 6.1.5.1)
|
activejob (= 6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
actionpack (6.1.5.1)
|
actionpack (6.1.6.1)
|
||||||
actionview (= 6.1.5.1)
|
actionview (= 6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
rack (~> 2.0, >= 2.0.9)
|
rack (~> 2.0, >= 2.0.9)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||||
actiontext (6.1.5.1)
|
actiontext (6.1.6.1)
|
||||||
actionpack (= 6.1.5.1)
|
actionpack (= 6.1.6.1)
|
||||||
activerecord (= 6.1.5.1)
|
activerecord (= 6.1.6.1)
|
||||||
activestorage (= 6.1.5.1)
|
activestorage (= 6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (6.1.5.1)
|
actionview (6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.4)
|
erubi (~> 1.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||||
active_record_query_trace (1.8)
|
active_record_query_trace (1.8)
|
||||||
activejob (6.1.5.1)
|
activejob (6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (6.1.5.1)
|
activemodel (6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
activerecord (6.1.5.1)
|
activerecord (6.1.6.1)
|
||||||
activemodel (= 6.1.5.1)
|
activemodel (= 6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
activerecord-import (1.3.0)
|
activerecord-import (1.4.0)
|
||||||
activerecord (>= 4.2)
|
activerecord (>= 4.2)
|
||||||
activestorage (6.1.5.1)
|
activestorage (6.1.6.1)
|
||||||
actionpack (= 6.1.5.1)
|
actionpack (= 6.1.6.1)
|
||||||
activejob (= 6.1.5.1)
|
activejob (= 6.1.6.1)
|
||||||
activerecord (= 6.1.5.1)
|
activerecord (= 6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
marcel (~> 1.0)
|
marcel (~> 1.0)
|
||||||
mini_mime (>= 1.1.0)
|
mini_mime (>= 1.1.0)
|
||||||
activesupport (6.1.5.1)
|
activesupport (6.1.6.1)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
minitest (>= 5.1)
|
minitest (>= 5.1)
|
||||||
|
@ -91,20 +91,20 @@ GEM
|
||||||
ast (2.4.2)
|
ast (2.4.2)
|
||||||
attr_extras (6.2.5)
|
attr_extras (6.2.5)
|
||||||
aws-eventstream (1.2.0)
|
aws-eventstream (1.2.0)
|
||||||
aws-partitions (1.556.0)
|
aws-partitions (1.605.0)
|
||||||
aws-sdk-core (3.126.2)
|
aws-sdk-core (3.131.2)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
aws-partitions (~> 1, >= 1.525.0)
|
aws-partitions (~> 1, >= 1.525.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
jmespath (~> 1.0)
|
jmespath (~> 1, >= 1.6.1)
|
||||||
aws-sdk-kms (1.54.0)
|
aws-sdk-kms (1.57.0)
|
||||||
aws-sdk-core (~> 3, >= 3.126.0)
|
aws-sdk-core (~> 3, >= 3.127.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sdk-s3 (1.112.0)
|
aws-sdk-s3 (1.114.0)
|
||||||
aws-sdk-core (~> 3, >= 3.126.0)
|
aws-sdk-core (~> 3, >= 3.127.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.4)
|
aws-sigv4 (~> 1.4)
|
||||||
aws-sigv4 (1.4.0)
|
aws-sigv4 (1.5.0)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
azure-storage-blob (2.0.3)
|
azure-storage-blob (2.0.3)
|
||||||
azure-storage-common (~> 2.0)
|
azure-storage-common (~> 2.0)
|
||||||
|
@ -117,31 +117,31 @@ GEM
|
||||||
barnes (0.0.9)
|
barnes (0.0.9)
|
||||||
multi_json (~> 1)
|
multi_json (~> 1)
|
||||||
statsd-ruby (~> 1.1)
|
statsd-ruby (~> 1.1)
|
||||||
bcrypt (3.1.16)
|
bcrypt (3.1.18)
|
||||||
bindex (0.8.1)
|
bindex (0.8.1)
|
||||||
bootsnap (1.10.3)
|
bootsnap (1.12.0)
|
||||||
msgpack (~> 1.2)
|
msgpack (~> 1.2)
|
||||||
brakeman (5.2.1)
|
brakeman (5.2.3)
|
||||||
browser (5.3.1)
|
browser (5.3.1)
|
||||||
builder (3.2.4)
|
builder (3.2.4)
|
||||||
bullet (7.0.1)
|
bullet (7.0.2)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
uniform_notifier (~> 1.11)
|
uniform_notifier (~> 1.11)
|
||||||
bundle-audit (0.1.0)
|
bundle-audit (0.1.0)
|
||||||
bundler-audit
|
bundler-audit
|
||||||
bundler-audit (0.9.0.1)
|
bundler-audit (0.9.1)
|
||||||
bundler (>= 1.2.0, < 3)
|
bundler (>= 1.2.0, < 3)
|
||||||
thor (~> 1.0)
|
thor (~> 1.0)
|
||||||
byebug (11.1.3)
|
byebug (11.1.3)
|
||||||
climate_control (1.0.1)
|
climate_control (1.1.1)
|
||||||
coderay (1.1.3)
|
coderay (1.1.3)
|
||||||
commonmarker (0.23.4)
|
commonmarker (0.23.5)
|
||||||
concurrent-ruby (1.1.10)
|
concurrent-ruby (1.1.10)
|
||||||
connection_pool (2.2.5)
|
connection_pool (2.2.5)
|
||||||
crack (0.4.5)
|
crack (0.4.5)
|
||||||
rexml
|
rexml
|
||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
cypress-on-rails (1.12.1)
|
cypress-on-rails (1.13.1)
|
||||||
rack
|
rack
|
||||||
database_cleaner (2.0.1)
|
database_cleaner (2.0.1)
|
||||||
database_cleaner-active_record (~> 2.0.0)
|
database_cleaner-active_record (~> 2.0.0)
|
||||||
|
@ -151,10 +151,12 @@ GEM
|
||||||
database_cleaner-core (2.0.1)
|
database_cleaner-core (2.0.1)
|
||||||
datetime_picker_rails (0.0.7)
|
datetime_picker_rails (0.0.7)
|
||||||
momentjs-rails (>= 2.8.1)
|
momentjs-rails (>= 2.8.1)
|
||||||
ddtrace (0.54.2)
|
ddtrace (1.2.0)
|
||||||
debase-ruby_core_source (<= 0.10.14)
|
debase-ruby_core_source (= 0.10.16)
|
||||||
|
libddprof (~> 0.6.0.1.0)
|
||||||
|
libddwaf (~> 1.3.0.2.0)
|
||||||
msgpack
|
msgpack
|
||||||
debase-ruby_core_source (0.10.14)
|
debase-ruby_core_source (0.10.16)
|
||||||
declarative (0.0.20)
|
declarative (0.0.20)
|
||||||
devise (4.8.1)
|
devise (4.8.1)
|
||||||
bcrypt (~> 3.0)
|
bcrypt (~> 3.0)
|
||||||
|
@ -176,7 +178,7 @@ GEM
|
||||||
dotenv-rails (2.7.6)
|
dotenv-rails (2.7.6)
|
||||||
dotenv (= 2.7.6)
|
dotenv (= 2.7.6)
|
||||||
railties (>= 3.2)
|
railties (>= 3.2)
|
||||||
down (5.3.0)
|
down (5.3.1)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
ecma-re-validator (0.4.0)
|
ecma-re-validator (0.4.0)
|
||||||
regexp_parser (~> 2.2)
|
regexp_parser (~> 2.2)
|
||||||
|
@ -188,36 +190,60 @@ GEM
|
||||||
facebook-messenger (2.0.1)
|
facebook-messenger (2.0.1)
|
||||||
httparty (~> 0.13, >= 0.13.7)
|
httparty (~> 0.13, >= 0.13.7)
|
||||||
rack (>= 1.4.5)
|
rack (>= 1.4.5)
|
||||||
factory_bot (6.2.0)
|
factory_bot (6.2.1)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
factory_bot_rails (6.2.0)
|
factory_bot_rails (6.2.0)
|
||||||
factory_bot (~> 6.2.0)
|
factory_bot (~> 6.2.0)
|
||||||
railties (>= 5.0.0)
|
railties (>= 5.0.0)
|
||||||
faker (2.19.0)
|
faker (2.21.0)
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.8.11, < 2)
|
||||||
faraday (1.0.1)
|
faraday (1.10.0)
|
||||||
multipart-post (>= 1.2, < 3)
|
faraday-em_http (~> 1.0)
|
||||||
|
faraday-em_synchrony (~> 1.0)
|
||||||
|
faraday-excon (~> 1.1)
|
||||||
|
faraday-httpclient (~> 1.0)
|
||||||
|
faraday-multipart (~> 1.0)
|
||||||
|
faraday-net_http (~> 1.0)
|
||||||
|
faraday-net_http_persistent (~> 1.0)
|
||||||
|
faraday-patron (~> 1.0)
|
||||||
|
faraday-rack (~> 1.0)
|
||||||
|
faraday-retry (~> 1.0)
|
||||||
|
ruby2_keywords (>= 0.0.4)
|
||||||
|
faraday-em_http (1.0.0)
|
||||||
|
faraday-em_synchrony (1.0.0)
|
||||||
|
faraday-excon (1.1.0)
|
||||||
|
faraday-httpclient (1.0.1)
|
||||||
|
faraday-multipart (1.0.4)
|
||||||
|
multipart-post (~> 2)
|
||||||
|
faraday-net_http (1.0.1)
|
||||||
|
faraday-net_http_persistent (1.2.0)
|
||||||
|
faraday-patron (1.0.0)
|
||||||
|
faraday-rack (1.0.0)
|
||||||
|
faraday-retry (1.0.3)
|
||||||
faraday_middleware (1.2.0)
|
faraday_middleware (1.2.0)
|
||||||
faraday (~> 1.0)
|
faraday (~> 1.0)
|
||||||
fcm (1.0.5)
|
fcm (1.0.8)
|
||||||
faraday (~> 1)
|
faraday (>= 1.0.0, < 3.0)
|
||||||
|
googleauth (~> 1)
|
||||||
ffi (1.15.5)
|
ffi (1.15.5)
|
||||||
flag_shih_tzu (0.3.23)
|
flag_shih_tzu (0.3.23)
|
||||||
foreman (0.87.2)
|
foreman (0.87.2)
|
||||||
fugit (1.5.3)
|
fugit (1.5.3)
|
||||||
et-orbi (~> 1, >= 1.2.7)
|
et-orbi (~> 1, >= 1.2.7)
|
||||||
raabro (~> 1.4)
|
raabro (~> 1.4)
|
||||||
gapic-common (0.3.4)
|
gapic-common (0.10.0)
|
||||||
google-protobuf (~> 3.12, >= 3.12.2)
|
faraday (>= 1.9, < 3.a)
|
||||||
googleapis-common-protos (>= 1.3.9, < 2.0)
|
faraday-retry (>= 1.0, < 3.a)
|
||||||
googleapis-common-protos-types (>= 1.0.4, < 2.0)
|
google-protobuf (~> 3.14)
|
||||||
googleauth (~> 0.9)
|
googleapis-common-protos (>= 1.3.12, < 2.a)
|
||||||
grpc (~> 1.25)
|
googleapis-common-protos-types (>= 1.3.1, < 2.a)
|
||||||
geocoder (1.7.3)
|
googleauth (~> 1.0)
|
||||||
|
grpc (~> 1.36)
|
||||||
|
geocoder (1.8.0)
|
||||||
gli (2.21.0)
|
gli (2.21.0)
|
||||||
globalid (1.0.0)
|
globalid (1.0.0)
|
||||||
activesupport (>= 5.0)
|
activesupport (>= 5.0)
|
||||||
google-apis-core (0.4.2)
|
google-apis-core (0.7.0)
|
||||||
addressable (~> 2.5, >= 2.5.1)
|
addressable (~> 2.5, >= 2.5.1)
|
||||||
googleauth (>= 0.16.2, < 2.a)
|
googleauth (>= 0.16.2, < 2.a)
|
||||||
httpclient (>= 2.8.1, < 3.a)
|
httpclient (>= 2.8.1, < 3.a)
|
||||||
|
@ -226,23 +252,27 @@ GEM
|
||||||
retriable (>= 2.0, < 4.a)
|
retriable (>= 2.0, < 4.a)
|
||||||
rexml
|
rexml
|
||||||
webrick
|
webrick
|
||||||
google-apis-iamcredentials_v1 (0.10.0)
|
google-apis-iamcredentials_v1 (0.13.0)
|
||||||
google-apis-core (>= 0.4, < 2.a)
|
google-apis-core (>= 0.7, < 2.a)
|
||||||
google-apis-storage_v1 (0.11.0)
|
google-apis-storage_v1 (0.18.0)
|
||||||
google-apis-core (>= 0.4, < 2.a)
|
google-apis-core (>= 0.7, < 2.a)
|
||||||
google-cloud-core (1.6.0)
|
google-cloud-core (1.6.0)
|
||||||
google-cloud-env (~> 1.0)
|
google-cloud-env (~> 1.0)
|
||||||
google-cloud-errors (~> 1.0)
|
google-cloud-errors (~> 1.0)
|
||||||
google-cloud-dialogflow (1.2.0)
|
google-cloud-dialogflow (1.5.0)
|
||||||
google-cloud-core (~> 1.5)
|
google-cloud-core (~> 1.6)
|
||||||
google-cloud-dialogflow-v2 (~> 0.1)
|
google-cloud-dialogflow-v2 (>= 0.15, < 2.a)
|
||||||
google-cloud-dialogflow-v2 (0.6.4)
|
google-cloud-dialogflow-v2 (0.17.0)
|
||||||
gapic-common (~> 0.3)
|
gapic-common (>= 0.10, < 2.a)
|
||||||
google-cloud-errors (~> 1.0)
|
google-cloud-errors (~> 1.0)
|
||||||
google-cloud-env (1.5.0)
|
google-cloud-location (>= 0.0, < 2.a)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
google-cloud-env (1.6.0)
|
||||||
|
faraday (>= 0.17.3, < 3.0)
|
||||||
google-cloud-errors (1.2.0)
|
google-cloud-errors (1.2.0)
|
||||||
google-cloud-storage (1.36.1)
|
google-cloud-location (0.2.0)
|
||||||
|
gapic-common (>= 0.10, < 2.a)
|
||||||
|
google-cloud-errors (~> 1.0)
|
||||||
|
google-cloud-storage (1.37.0)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
digest-crc (~> 0.4)
|
digest-crc (~> 0.4)
|
||||||
google-apis-iamcredentials_v1 (~> 0.1)
|
google-apis-iamcredentials_v1 (~> 0.1)
|
||||||
|
@ -250,32 +280,32 @@ GEM
|
||||||
google-cloud-core (~> 1.6)
|
google-cloud-core (~> 1.6)
|
||||||
googleauth (>= 0.16.2, < 2.a)
|
googleauth (>= 0.16.2, < 2.a)
|
||||||
mini_mime (~> 1.0)
|
mini_mime (~> 1.0)
|
||||||
google-protobuf (3.19.4)
|
google-protobuf (3.21.2)
|
||||||
google-protobuf (3.19.4-x86_64-darwin)
|
google-protobuf (3.21.2-x86_64-darwin)
|
||||||
google-protobuf (3.19.4-x86_64-linux)
|
google-protobuf (3.21.2-x86_64-linux)
|
||||||
googleapis-common-protos (1.3.12)
|
googleapis-common-protos (1.3.12)
|
||||||
google-protobuf (~> 3.14)
|
google-protobuf (~> 3.14)
|
||||||
googleapis-common-protos-types (~> 1.2)
|
googleapis-common-protos-types (~> 1.2)
|
||||||
grpc (~> 1.27)
|
grpc (~> 1.27)
|
||||||
googleapis-common-protos-types (1.3.0)
|
googleapis-common-protos-types (1.3.2)
|
||||||
google-protobuf (~> 3.14)
|
google-protobuf (~> 3.14)
|
||||||
googleauth (0.17.1)
|
googleauth (1.2.0)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
faraday (>= 0.17.3, < 3.a)
|
||||||
jwt (>= 1.4, < 3.0)
|
jwt (>= 1.4, < 3.0)
|
||||||
memoist (~> 0.16)
|
memoist (~> 0.16)
|
||||||
multi_json (~> 1.11)
|
multi_json (~> 1.11)
|
||||||
os (>= 0.9, < 2.0)
|
os (>= 0.9, < 2.0)
|
||||||
signet (~> 0.15)
|
signet (>= 0.16, < 2.a)
|
||||||
groupdate (6.0.1)
|
groupdate (6.1.0)
|
||||||
activesupport (>= 5.2)
|
activesupport (>= 5.2)
|
||||||
grpc (1.43.1)
|
grpc (1.47.0)
|
||||||
google-protobuf (~> 3.18)
|
google-protobuf (~> 3.19)
|
||||||
googleapis-common-protos-types (~> 1.0)
|
googleapis-common-protos-types (~> 1.0)
|
||||||
grpc (1.43.1-universal-darwin)
|
grpc (1.47.0-x86_64-darwin)
|
||||||
google-protobuf (~> 3.18)
|
google-protobuf (~> 3.19)
|
||||||
googleapis-common-protos-types (~> 1.0)
|
googleapis-common-protos-types (~> 1.0)
|
||||||
grpc (1.43.1-x86_64-linux)
|
grpc (1.47.0-x86_64-linux)
|
||||||
google-protobuf (~> 3.18)
|
google-protobuf (~> 3.19)
|
||||||
googleapis-common-protos-types (~> 1.0)
|
googleapis-common-protos-types (~> 1.0)
|
||||||
haikunator (1.1.1)
|
haikunator (1.1.1)
|
||||||
hairtrigger (0.2.25)
|
hairtrigger (0.2.25)
|
||||||
|
@ -289,13 +319,13 @@ GEM
|
||||||
html2text (0.2.1)
|
html2text (0.2.1)
|
||||||
nokogiri (~> 1.6)
|
nokogiri (~> 1.6)
|
||||||
http-accept (1.7.0)
|
http-accept (1.7.0)
|
||||||
http-cookie (1.0.4)
|
http-cookie (1.0.5)
|
||||||
domain_name (~> 0.5)
|
domain_name (~> 0.5)
|
||||||
httparty (0.20.0)
|
httparty (0.20.0)
|
||||||
mime-types (~> 3.0)
|
mime-types (~> 3.0)
|
||||||
multi_xml (>= 0.5.2)
|
multi_xml (>= 0.5.2)
|
||||||
httpclient (2.8.3)
|
httpclient (2.8.3)
|
||||||
i18n (1.10.0)
|
i18n (1.11.0)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
image_processing (1.12.2)
|
image_processing (1.12.2)
|
||||||
mini_magick (>= 4.9.5, < 5)
|
mini_magick (>= 4.9.5, < 5)
|
||||||
|
@ -304,19 +334,19 @@ GEM
|
||||||
actionview (>= 5.0.0)
|
actionview (>= 5.0.0)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
jmespath (1.6.1)
|
jmespath (1.6.1)
|
||||||
jquery-rails (4.4.0)
|
jquery-rails (4.5.0)
|
||||||
rails-dom-testing (>= 1, < 3)
|
rails-dom-testing (>= 1, < 3)
|
||||||
railties (>= 4.2.0)
|
railties (>= 4.2.0)
|
||||||
thor (>= 0.14, < 2.0)
|
thor (>= 0.14, < 2.0)
|
||||||
json (2.6.1)
|
json (2.6.2)
|
||||||
json_refs (0.1.7)
|
json_refs (0.1.7)
|
||||||
hana
|
hana
|
||||||
json_schemer (0.2.19)
|
json_schemer (0.2.21)
|
||||||
ecma-re-validator (~> 0.3)
|
ecma-re-validator (~> 0.3)
|
||||||
hana (~> 1.3)
|
hana (~> 1.3)
|
||||||
regexp_parser (~> 2.0)
|
regexp_parser (~> 2.0)
|
||||||
uri_template (~> 0.7)
|
uri_template (~> 0.7)
|
||||||
jwt (2.3.0)
|
jwt (2.4.1)
|
||||||
kaminari (1.2.2)
|
kaminari (1.2.2)
|
||||||
activesupport (>= 4.1.0)
|
activesupport (>= 4.1.0)
|
||||||
kaminari-actionview (= 1.2.2)
|
kaminari-actionview (= 1.2.2)
|
||||||
|
@ -329,17 +359,27 @@ GEM
|
||||||
activerecord
|
activerecord
|
||||||
kaminari-core (= 1.2.2)
|
kaminari-core (= 1.2.2)
|
||||||
kaminari-core (1.2.2)
|
kaminari-core (1.2.2)
|
||||||
koala (3.1.0)
|
koala (3.2.0)
|
||||||
addressable
|
addressable
|
||||||
faraday (< 2)
|
faraday (< 2)
|
||||||
json (>= 1.8)
|
json (>= 1.8)
|
||||||
rexml
|
rexml
|
||||||
launchy (2.5.0)
|
launchy (2.5.0)
|
||||||
addressable (~> 2.7)
|
addressable (~> 2.7)
|
||||||
letter_opener (1.7.0)
|
letter_opener (1.8.1)
|
||||||
launchy (~> 2.2)
|
launchy (>= 2.2, < 3)
|
||||||
line-bot-api (1.23.0)
|
libddprof (0.6.0.1.0)
|
||||||
liquid (5.1.0)
|
libddprof (0.6.0.1.0-x86_64-linux)
|
||||||
|
libddwaf (1.3.0.2.0)
|
||||||
|
ffi (~> 1.0)
|
||||||
|
libddwaf (1.3.0.2.0-arm64-darwin)
|
||||||
|
ffi (~> 1.0)
|
||||||
|
libddwaf (1.3.0.2.0-x86_64-darwin)
|
||||||
|
ffi (~> 1.0)
|
||||||
|
libddwaf (1.3.0.2.0-x86_64-linux)
|
||||||
|
ffi (~> 1.0)
|
||||||
|
line-bot-api (1.25.0)
|
||||||
|
liquid (5.3.0)
|
||||||
listen (3.7.1)
|
listen (3.7.1)
|
||||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||||
rb-inotify (~> 0.9, >= 0.9.10)
|
rb-inotify (~> 0.9, >= 0.9.10)
|
||||||
|
@ -358,36 +398,36 @@ GEM
|
||||||
mini_magick (4.11.0)
|
mini_magick (4.11.0)
|
||||||
mini_mime (1.1.2)
|
mini_mime (1.1.2)
|
||||||
mini_portile2 (2.8.0)
|
mini_portile2 (2.8.0)
|
||||||
minitest (5.15.0)
|
minitest (5.16.2)
|
||||||
mock_redis (0.30.0)
|
mock_redis (0.32.0)
|
||||||
ruby2_keywords
|
ruby2_keywords
|
||||||
momentjs-rails (2.29.1.1)
|
momentjs-rails (2.29.1.1)
|
||||||
railties (>= 3.1)
|
railties (>= 3.1)
|
||||||
msgpack (1.4.5)
|
msgpack (1.5.3)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multi_xml (0.6.0)
|
multi_xml (0.6.0)
|
||||||
multipart-post (2.1.1)
|
multipart-post (2.2.3)
|
||||||
net-http-persistent (4.0.1)
|
net-http-persistent (4.0.1)
|
||||||
connection_pool (~> 2.2)
|
connection_pool (~> 2.2)
|
||||||
netrc (0.11.0)
|
netrc (0.11.0)
|
||||||
newrelic_rpm (8.7.0)
|
newrelic_rpm (8.9.0)
|
||||||
nio4r (2.5.8)
|
nio4r (2.5.8)
|
||||||
nokogiri (1.13.6)
|
nokogiri (1.13.7)
|
||||||
mini_portile2 (~> 2.8.0)
|
mini_portile2 (~> 2.8.0)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.13.6-arm64-darwin)
|
nokogiri (1.13.7-arm64-darwin)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.13.6-x86_64-darwin)
|
nokogiri (1.13.7-x86_64-darwin)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.13.6-x86_64-linux)
|
nokogiri (1.13.7-x86_64-linux)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
oauth (0.5.8)
|
oauth (0.5.10)
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
os (1.1.4)
|
os (1.1.4)
|
||||||
parallel (1.21.0)
|
parallel (1.22.1)
|
||||||
parser (3.1.1.0)
|
parser (3.1.2.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
pg (1.3.2)
|
pg (1.4.1)
|
||||||
pg_search (2.3.6)
|
pg_search (2.3.6)
|
||||||
activerecord (>= 5.2)
|
activerecord (>= 5.2)
|
||||||
activesupport (>= 5.2)
|
activesupport (>= 5.2)
|
||||||
|
@ -398,46 +438,46 @@ GEM
|
||||||
method_source (~> 1.0)
|
method_source (~> 1.0)
|
||||||
pry-rails (0.3.9)
|
pry-rails (0.3.9)
|
||||||
pry (>= 0.10.4)
|
pry (>= 0.10.4)
|
||||||
public_suffix (4.0.6)
|
public_suffix (4.0.7)
|
||||||
puma (5.6.4)
|
puma (5.6.4)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
pundit (2.2.0)
|
pundit (2.2.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
raabro (1.4.0)
|
raabro (1.4.0)
|
||||||
racc (1.6.0)
|
racc (1.6.0)
|
||||||
rack (2.2.3.1)
|
rack (2.2.4)
|
||||||
rack-attack (6.6.0)
|
rack-attack (6.6.1)
|
||||||
rack (>= 1.0, < 3)
|
rack (>= 1.0, < 3)
|
||||||
rack-cors (1.1.1)
|
rack-cors (1.1.1)
|
||||||
rack (>= 2.0.0)
|
rack (>= 2.0.0)
|
||||||
rack-proxy (0.7.2)
|
rack-proxy (0.7.2)
|
||||||
rack
|
rack
|
||||||
rack-test (1.1.0)
|
rack-test (2.0.2)
|
||||||
rack (>= 1.0, < 3)
|
rack (>= 1.3)
|
||||||
rack-timeout (0.6.0)
|
rack-timeout (0.6.3)
|
||||||
rails (6.1.5.1)
|
rails (6.1.6.1)
|
||||||
actioncable (= 6.1.5.1)
|
actioncable (= 6.1.6.1)
|
||||||
actionmailbox (= 6.1.5.1)
|
actionmailbox (= 6.1.6.1)
|
||||||
actionmailer (= 6.1.5.1)
|
actionmailer (= 6.1.6.1)
|
||||||
actionpack (= 6.1.5.1)
|
actionpack (= 6.1.6.1)
|
||||||
actiontext (= 6.1.5.1)
|
actiontext (= 6.1.6.1)
|
||||||
actionview (= 6.1.5.1)
|
actionview (= 6.1.6.1)
|
||||||
activejob (= 6.1.5.1)
|
activejob (= 6.1.6.1)
|
||||||
activemodel (= 6.1.5.1)
|
activemodel (= 6.1.6.1)
|
||||||
activerecord (= 6.1.5.1)
|
activerecord (= 6.1.6.1)
|
||||||
activestorage (= 6.1.5.1)
|
activestorage (= 6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
bundler (>= 1.15.0)
|
bundler (>= 1.15.0)
|
||||||
railties (= 6.1.5.1)
|
railties (= 6.1.6.1)
|
||||||
sprockets-rails (>= 2.0.0)
|
sprockets-rails (>= 2.0.0)
|
||||||
rails-dom-testing (2.0.3)
|
rails-dom-testing (2.0.3)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.4.3)
|
rails-html-sanitizer (1.4.3)
|
||||||
loofah (~> 2.3)
|
loofah (~> 2.3)
|
||||||
railties (6.1.5.1)
|
railties (6.1.6.1)
|
||||||
actionpack (= 6.1.5.1)
|
actionpack (= 6.1.6.1)
|
||||||
activesupport (= 6.1.5.1)
|
activesupport (= 6.1.6.1)
|
||||||
method_source
|
method_source
|
||||||
rake (>= 12.2)
|
rake (>= 12.2)
|
||||||
thor (~> 1.0)
|
thor (~> 1.0)
|
||||||
|
@ -446,11 +486,11 @@ GEM
|
||||||
rb-fsevent (0.11.1)
|
rb-fsevent (0.11.1)
|
||||||
rb-inotify (0.10.1)
|
rb-inotify (0.10.1)
|
||||||
ffi (~> 1.0)
|
ffi (~> 1.0)
|
||||||
redis (4.6.0)
|
redis (4.7.1)
|
||||||
redis-namespace (1.8.1)
|
redis-namespace (1.8.2)
|
||||||
redis (>= 3.0.4)
|
redis (>= 3.0.4)
|
||||||
regexp_parser (2.2.1)
|
regexp_parser (2.5.0)
|
||||||
representable (3.1.1)
|
representable (3.2.0)
|
||||||
declarative (< 0.1.0)
|
declarative (< 0.1.0)
|
||||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||||
uber (< 0.2.0)
|
uber (< 0.2.0)
|
||||||
|
@ -469,7 +509,7 @@ GEM
|
||||||
rspec-expectations (3.11.0)
|
rspec-expectations (3.11.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.11.0)
|
rspec-support (~> 3.11.0)
|
||||||
rspec-mocks (3.11.0)
|
rspec-mocks (3.11.1)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.11.0)
|
rspec-support (~> 3.11.0)
|
||||||
rspec-rails (5.0.3)
|
rspec-rails (5.0.3)
|
||||||
|
@ -481,26 +521,27 @@ GEM
|
||||||
rspec-mocks (~> 3.10)
|
rspec-mocks (~> 3.10)
|
||||||
rspec-support (~> 3.10)
|
rspec-support (~> 3.10)
|
||||||
rspec-support (3.11.0)
|
rspec-support (3.11.0)
|
||||||
rubocop (1.25.1)
|
rubocop (1.31.2)
|
||||||
|
json (~> 2.3)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.1.0.0)
|
parser (>= 3.1.0.0)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.8, < 3.0)
|
regexp_parser (>= 1.8, < 3.0)
|
||||||
rexml
|
rexml (>= 3.2.5, < 4.0)
|
||||||
rubocop-ast (>= 1.15.1, < 2.0)
|
rubocop-ast (>= 1.18.0, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 1.4.0, < 3.0)
|
unicode-display_width (>= 1.4.0, < 3.0)
|
||||||
rubocop-ast (1.16.0)
|
rubocop-ast (1.19.1)
|
||||||
parser (>= 3.1.1.0)
|
parser (>= 3.1.1.0)
|
||||||
rubocop-performance (1.13.2)
|
rubocop-performance (1.14.2)
|
||||||
rubocop (>= 1.7.0, < 2.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
rubocop-ast (>= 0.4.0)
|
rubocop-ast (>= 0.4.0)
|
||||||
rubocop-rails (2.13.2)
|
rubocop-rails (2.15.2)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
rack (>= 1.1)
|
rack (>= 1.1)
|
||||||
rubocop (>= 1.7.0, < 2.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
rubocop-rspec (2.8.0)
|
rubocop-rspec (2.12.1)
|
||||||
rubocop (~> 1.19)
|
rubocop (~> 1.31)
|
||||||
ruby-progressbar (1.11.0)
|
ruby-progressbar (1.11.0)
|
||||||
ruby-vips (2.1.4)
|
ruby-vips (2.1.4)
|
||||||
ffi (~> 1.12)
|
ffi (~> 1.12)
|
||||||
|
@ -508,7 +549,7 @@ GEM
|
||||||
ruby2ruby (2.4.4)
|
ruby2ruby (2.4.4)
|
||||||
ruby_parser (~> 3.1)
|
ruby_parser (~> 3.1)
|
||||||
sexp_processor (~> 4.6)
|
sexp_processor (~> 4.6)
|
||||||
ruby_parser (3.18.1)
|
ruby_parser (3.19.1)
|
||||||
sexp_processor (~> 4.16)
|
sexp_processor (~> 4.16)
|
||||||
sassc (2.4.0)
|
sassc (2.4.0)
|
||||||
ffi (~> 1.9)
|
ffi (~> 1.9)
|
||||||
|
@ -518,37 +559,37 @@ GEM
|
||||||
sprockets (> 3.0)
|
sprockets (> 3.0)
|
||||||
sprockets-rails
|
sprockets-rails
|
||||||
tilt
|
tilt
|
||||||
scout_apm (5.1.1)
|
scout_apm (5.2.0)
|
||||||
parser
|
parser
|
||||||
seed_dump (3.3.1)
|
seed_dump (3.3.1)
|
||||||
activerecord (>= 4)
|
activerecord (>= 4)
|
||||||
activesupport (>= 4)
|
activesupport (>= 4)
|
||||||
selectize-rails (0.12.6)
|
selectize-rails (0.12.6)
|
||||||
semantic_range (3.0.0)
|
semantic_range (3.0.0)
|
||||||
sentry-rails (5.3.0)
|
sentry-rails (5.3.1)
|
||||||
railties (>= 5.0)
|
railties (>= 5.0)
|
||||||
sentry-ruby-core (~> 5.3.0)
|
sentry-ruby-core (~> 5.3.1)
|
||||||
sentry-ruby (5.3.0)
|
sentry-ruby (5.3.1)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
sentry-ruby-core (= 5.3.0)
|
sentry-ruby-core (= 5.3.1)
|
||||||
sentry-ruby-core (5.3.0)
|
sentry-ruby-core (5.3.1)
|
||||||
concurrent-ruby
|
concurrent-ruby
|
||||||
sentry-sidekiq (5.3.0)
|
sentry-sidekiq (5.3.1)
|
||||||
sentry-ruby-core (~> 5.3.0)
|
sentry-ruby-core (~> 5.3.1)
|
||||||
sidekiq (>= 3.0)
|
sidekiq (>= 3.0)
|
||||||
sexp_processor (4.16.0)
|
sexp_processor (4.16.1)
|
||||||
shoulda-matchers (5.1.0)
|
shoulda-matchers (5.1.0)
|
||||||
activesupport (>= 5.2.0)
|
activesupport (>= 5.2.0)
|
||||||
sidekiq (6.4.1)
|
sidekiq (6.4.2)
|
||||||
connection_pool (>= 2.2.2)
|
connection_pool (>= 2.2.2)
|
||||||
rack (~> 2.0)
|
rack (~> 2.0)
|
||||||
redis (>= 4.2.0)
|
redis (>= 4.2.0)
|
||||||
sidekiq-cron (1.4.0)
|
sidekiq-cron (1.6.0)
|
||||||
fugit (~> 1)
|
fugit (~> 1)
|
||||||
sidekiq (>= 4.2.1)
|
sidekiq (>= 4.2.1)
|
||||||
signet (0.16.0)
|
signet (0.17.0)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
faraday (>= 0.17.5, < 3.a)
|
||||||
jwt (>= 1.5, < 3.0)
|
jwt (>= 1.5, < 3.0)
|
||||||
multi_json (~> 1.10)
|
multi_json (~> 1.10)
|
||||||
simplecov (0.17.1)
|
simplecov (0.17.1)
|
||||||
|
@ -566,7 +607,7 @@ GEM
|
||||||
spring-watcher-listen (2.0.1)
|
spring-watcher-listen (2.0.1)
|
||||||
listen (>= 2.7, < 4.0)
|
listen (>= 2.7, < 4.0)
|
||||||
spring (>= 1.2, < 3.0)
|
spring (>= 1.2, < 3.0)
|
||||||
sprockets (4.0.3)
|
sprockets (4.1.1)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
rack (> 1, < 3)
|
rack (> 1, < 3)
|
||||||
sprockets-rails (3.4.2)
|
sprockets-rails (3.4.2)
|
||||||
|
@ -575,31 +616,31 @@ GEM
|
||||||
sprockets (>= 3.0.0)
|
sprockets (>= 3.0.0)
|
||||||
squasher (0.6.2)
|
squasher (0.6.2)
|
||||||
statsd-ruby (1.5.0)
|
statsd-ruby (1.5.0)
|
||||||
telephone_number (1.4.13)
|
telephone_number (1.4.16)
|
||||||
thor (1.2.1)
|
thor (1.2.1)
|
||||||
tilt (2.0.10)
|
tilt (2.0.10)
|
||||||
time_diff (0.3.0)
|
time_diff (0.3.0)
|
||||||
activesupport
|
activesupport
|
||||||
i18n
|
i18n
|
||||||
trailblazer-option (0.1.2)
|
trailblazer-option (0.1.2)
|
||||||
twilio-ruby (5.66.0)
|
twilio-ruby (5.68.0)
|
||||||
faraday (>= 0.9, < 2.0)
|
faraday (>= 0.9, < 3.0)
|
||||||
jwt (>= 1.5, <= 2.5)
|
jwt (>= 1.5, <= 2.5)
|
||||||
nokogiri (>= 1.6, < 2.0)
|
nokogiri (>= 1.6, < 2.0)
|
||||||
twitty (0.1.4)
|
twitty (0.1.4)
|
||||||
oauth
|
oauth
|
||||||
tzinfo (2.0.4)
|
tzinfo (2.0.4)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
tzinfo-data (1.2021.5)
|
tzinfo-data (1.2022.1)
|
||||||
tzinfo (>= 1.0.0)
|
tzinfo (>= 1.0.0)
|
||||||
uber (0.1.0)
|
uber (0.1.0)
|
||||||
uglifier (4.2.0)
|
uglifier (4.2.0)
|
||||||
execjs (>= 0.3.0, < 3)
|
execjs (>= 0.3.0, < 3)
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.8)
|
unf_ext (0.0.8.2)
|
||||||
unicode-display_width (2.1.0)
|
unicode-display_width (2.2.0)
|
||||||
uniform_notifier (1.14.2)
|
uniform_notifier (1.16.0)
|
||||||
uri_template (0.7.0)
|
uri_template (0.7.0)
|
||||||
valid_email2 (4.0.3)
|
valid_email2 (4.0.3)
|
||||||
activemodel (>= 3.2)
|
activemodel (>= 3.2)
|
||||||
|
@ -631,7 +672,7 @@ GEM
|
||||||
working_hours (1.4.1)
|
working_hours (1.4.1)
|
||||||
activesupport (>= 3.2)
|
activesupport (>= 3.2)
|
||||||
tzinfo
|
tzinfo
|
||||||
zeitwerk (2.5.4)
|
zeitwerk (2.6.0)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
arm64-darwin-20
|
arm64-darwin-20
|
||||||
|
@ -705,7 +746,7 @@ DEPENDENCIES
|
||||||
rack-attack
|
rack-attack
|
||||||
rack-cors
|
rack-cors
|
||||||
rack-timeout
|
rack-timeout
|
||||||
rails
|
rails (~> 6.1)
|
||||||
redis
|
redis
|
||||||
redis-namespace
|
redis-namespace
|
||||||
responders
|
responders
|
||||||
|
|
|
@ -9,12 +9,15 @@ class Campaigns::CampaignConversationBuilder
|
||||||
@contact_inbox.lock!
|
@contact_inbox.lock!
|
||||||
|
|
||||||
# We won't send campaigns if a conversation is already present
|
# We won't send campaigns if a conversation is already present
|
||||||
return if @contact_inbox.reload.conversations.present?
|
raise 'Conversation alread present' if @contact_inbox.reload.conversations.present?
|
||||||
|
|
||||||
@conversation = ::Conversation.create!(conversation_params)
|
@conversation = ::Conversation.create!(conversation_params)
|
||||||
Messages::MessageBuilder.new(@campaign.sender, @conversation, message_params).perform
|
Messages::MessageBuilder.new(@campaign.sender, @conversation, message_params).perform
|
||||||
end
|
end
|
||||||
@conversation
|
@conversation
|
||||||
|
rescue StandardError => e
|
||||||
|
Rails.logger.info(e.message)
|
||||||
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -14,7 +14,7 @@ class Platform::Api::V1::UsersController < PlatformController
|
||||||
|
|
||||||
def login
|
def login
|
||||||
encoded_email = ERB::Util.url_encode(@resource.email)
|
encoded_email = ERB::Util.url_encode(@resource.email)
|
||||||
render json: { url: "#{ENV['FRONTEND_URL']}/app/login?email=#{encoded_email}&sso_auth_token=#{@resource.generate_sso_auth_token}" }
|
render json: { url: "#{ENV.fetch('FRONTEND_URL', nil)}/app/login?email=#{encoded_email}&sso_auth_token=#{@resource.generate_sso_auth_token}" }
|
||||||
end
|
end
|
||||||
|
|
||||||
def show; end
|
def show; end
|
||||||
|
|
|
@ -47,7 +47,7 @@ class ContactIpLookupJob < ApplicationJob
|
||||||
def setup_vendor_db
|
def setup_vendor_db
|
||||||
base_url = 'https://download.maxmind.com/app/geoip_download'
|
base_url = 'https://download.maxmind.com/app/geoip_download'
|
||||||
source_file = Down.download(
|
source_file = Down.download(
|
||||||
"#{base_url}?edition_id=GeoLite2-City&suffix=tar.gz&license_key=#{ENV['IP_LOOKUP_API_KEY']}"
|
"#{base_url}?edition_id=GeoLite2-City&suffix=tar.gz&license_key=#{ENV.fetch('IP_LOOKUP_API_KEY', nil)}"
|
||||||
)
|
)
|
||||||
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(source_file))
|
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(source_file))
|
||||||
tar_extract.rewind
|
tar_extract.rewind
|
||||||
|
|
|
@ -3,7 +3,7 @@ class AdministratorNotifications::ChannelNotificationsMailer < ApplicationMailer
|
||||||
return unless smtp_config_set_or_development?
|
return unless smtp_config_set_or_development?
|
||||||
|
|
||||||
subject = 'Your Slack integration has expired'
|
subject = 'Your Slack integration has expired'
|
||||||
@action_url = "#{ENV['FRONTEND_URL']}/app/accounts/#{Current.account.id}/settings/integrations/slack"
|
@action_url = "#{ENV.fetch('FRONTEND_URL', nil)}/app/accounts/#{Current.account.id}/settings/integrations/slack"
|
||||||
send_mail_with_liquid(to: admin_emails, subject: subject) and return
|
send_mail_with_liquid(to: admin_emails, subject: subject) and return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ class AdministratorNotifications::ChannelNotificationsMailer < ApplicationMailer
|
||||||
return unless smtp_config_set_or_development?
|
return unless smtp_config_set_or_development?
|
||||||
|
|
||||||
subject = 'Your Facebook page connection has expired'
|
subject = 'Your Facebook page connection has expired'
|
||||||
@action_url = "#{ENV['FRONTEND_URL']}/app/accounts/#{Current.account.id}/settings/inboxes/#{inbox.id}"
|
@action_url = "#{ENV.fetch('FRONTEND_URL', nil)}/app/accounts/#{Current.account.id}/settings/inboxes/#{inbox.id}"
|
||||||
send_mail_with_liquid(to: admin_emails, subject: subject) and return
|
send_mail_with_liquid(to: admin_emails, subject: subject) and return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ class AdministratorNotifications::ChannelNotificationsMailer < ApplicationMailer
|
||||||
return unless smtp_config_set_or_development?
|
return unless smtp_config_set_or_development?
|
||||||
|
|
||||||
subject = 'Your email inbox has been disconnected. Please update the credentials for SMTP/IMAP'
|
subject = 'Your email inbox has been disconnected. Please update the credentials for SMTP/IMAP'
|
||||||
@action_url = "#{ENV['FRONTEND_URL']}/app/accounts/#{Current.account.id}/settings/inboxes/#{inbox.id}"
|
@action_url = "#{ENV.fetch('FRONTEND_URL', nil)}/app/accounts/#{Current.account.id}/settings/inboxes/#{inbox.id}"
|
||||||
send_mail_with_liquid(to: admin_emails, subject: subject) and return
|
send_mail_with_liquid(to: admin_emails, subject: subject) and return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,7 @@ class Account < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def support_email
|
def support_email
|
||||||
super || ENV['MAILER_SENDER_EMAIL'] || GlobalConfig.get('MAILER_SUPPORT_EMAIL')['MAILER_SUPPORT_EMAIL']
|
super || ENV.fetch('MAILER_SENDER_EMAIL') { GlobalConfig.get('MAILER_SUPPORT_EMAIL')['MAILER_SUPPORT_EMAIL'] }
|
||||||
end
|
end
|
||||||
|
|
||||||
def usage_limits
|
def usage_limits
|
||||||
|
|
|
@ -63,7 +63,7 @@ class Category < ApplicationRecord
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
validate :allowed_locales
|
validate :allowed_locales
|
||||||
validates :locale, uniqueness: { scope: %i[slug portal_id],
|
validates :locale, uniqueness: { scope: %i[slug portal_id],
|
||||||
message: 'should be unique in the category and portal' }
|
message: I18n.t('errors.categories.locale.unique') }
|
||||||
accepts_nested_attributes_for :related_categories
|
accepts_nested_attributes_for :related_categories
|
||||||
|
|
||||||
scope :search_by_locale, ->(locale) { where(locale: locale) if locale.present? }
|
scope :search_by_locale, ->(locale) { where(locale: locale) if locale.present? }
|
||||||
|
|
|
@ -72,7 +72,7 @@ class Channel::Telegram < ApplicationRecord
|
||||||
HTTParty.post("#{telegram_api_url}/deleteWebhook")
|
HTTParty.post("#{telegram_api_url}/deleteWebhook")
|
||||||
response = HTTParty.post("#{telegram_api_url}/setWebhook",
|
response = HTTParty.post("#{telegram_api_url}/setWebhook",
|
||||||
body: {
|
body: {
|
||||||
url: "#{ENV['FRONTEND_URL']}/webhooks/telegram/#{bot_token}"
|
url: "#{ENV.fetch('FRONTEND_URL', nil)}/webhooks/telegram/#{bot_token}"
|
||||||
})
|
})
|
||||||
errors.add(:bot_token, 'error setting up the webook') unless response.success?
|
errors.add(:bot_token, 'error setting up the webook') unless response.success?
|
||||||
end
|
end
|
||||||
|
|
|
@ -29,11 +29,11 @@ class Contact < ApplicationRecord
|
||||||
|
|
||||||
validates :account_id, presence: true
|
validates :account_id, presence: true
|
||||||
validates :email, allow_blank: true, uniqueness: { scope: [:account_id], case_sensitive: false },
|
validates :email, allow_blank: true, uniqueness: { scope: [:account_id], case_sensitive: false },
|
||||||
format: { with: Devise.email_regexp, message: 'Invalid email' }
|
format: { with: Devise.email_regexp, message: I18n.t('errors.contacts.email.invalid') }
|
||||||
validates :identifier, allow_blank: true, uniqueness: { scope: [:account_id] }
|
validates :identifier, allow_blank: true, uniqueness: { scope: [:account_id] }
|
||||||
validates :phone_number,
|
validates :phone_number,
|
||||||
allow_blank: true, uniqueness: { scope: [:account_id] },
|
allow_blank: true, uniqueness: { scope: [:account_id] },
|
||||||
format: { with: /\+[1-9]\d{1,14}\z/, message: 'Should be in e164 format' }
|
format: { with: /\+[1-9]\d{1,14}\z/, message: I18n.t('errors.contacts.phone_number.invalid') }
|
||||||
validates :name, length: { maximum: 255 }
|
validates :name, length: { maximum: 255 }
|
||||||
|
|
||||||
belongs_to :account
|
belongs_to :account
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#
|
#
|
||||||
class DataImport < ApplicationRecord
|
class DataImport < ApplicationRecord
|
||||||
belongs_to :account
|
belongs_to :account
|
||||||
validates :data_type, inclusion: { in: ['contacts'], message: '%<value>s is an invalid data type' }
|
validates :data_type, inclusion: { in: ['contacts'], message: I18n.t('errors.data_import.data_type.invalid') }
|
||||||
enum status: { pending: 0, processing: 1, completed: 2, failed: 3 }
|
enum status: { pending: 0, processing: 1, completed: 2, failed: 3 }
|
||||||
|
|
||||||
has_one_attached :import_file
|
has_one_attached :import_file
|
||||||
|
|
|
@ -115,13 +115,13 @@ class Inbox < ApplicationRecord
|
||||||
def callback_webhook_url
|
def callback_webhook_url
|
||||||
case channel_type
|
case channel_type
|
||||||
when 'Channel::TwilioSms'
|
when 'Channel::TwilioSms'
|
||||||
"#{ENV['FRONTEND_URL']}/twilio/callback"
|
"#{ENV.fetch('FRONTEND_URL', nil)}/twilio/callback"
|
||||||
when 'Channel::Sms'
|
when 'Channel::Sms'
|
||||||
"#{ENV['FRONTEND_URL']}/webhooks/sms/#{channel.phone_number.delete_prefix('+')}"
|
"#{ENV.fetch('FRONTEND_URL', nil)}/webhooks/sms/#{channel.phone_number.delete_prefix('+')}"
|
||||||
when 'Channel::Line'
|
when 'Channel::Line'
|
||||||
"#{ENV['FRONTEND_URL']}/webhooks/line/#{channel.line_channel_id}"
|
"#{ENV.fetch('FRONTEND_URL', nil)}/webhooks/line/#{channel.line_channel_id}"
|
||||||
when 'Channel::Whatsapp'
|
when 'Channel::Whatsapp'
|
||||||
"#{ENV['FRONTEND_URL']}/webhooks/whatsapp/#{channel.phone_number}"
|
"#{ENV.fetch('FRONTEND_URL', nil)}/webhooks/whatsapp/#{channel.phone_number}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,10 @@
|
||||||
# index_installation_configs_on_name_and_created_at (name,created_at) UNIQUE
|
# index_installation_configs_on_name_and_created_at (name,created_at) UNIQUE
|
||||||
#
|
#
|
||||||
class InstallationConfig < ApplicationRecord
|
class InstallationConfig < ApplicationRecord
|
||||||
|
# https://stackoverflow.com/questions/72970170/upgrading-to-rails-6-1-6-1-causes-psychdisallowedclass-tried-to-load-unspecif
|
||||||
|
# https://discuss.rubyonrails.org/t/cve-2022-32224-possible-rce-escalation-bug-with-serialized-columns-in-active-record/81017
|
||||||
|
# FIX ME : fixes breakage of installation config. we need to migrate.
|
||||||
|
# Fix configuration in application.rb
|
||||||
serialize :serialized_value, HashWithIndifferentAccess
|
serialize :serialized_value, HashWithIndifferentAccess
|
||||||
|
|
||||||
before_validation :set_lock
|
before_validation :set_lock
|
||||||
|
|
|
@ -28,7 +28,7 @@ class Integrations::App
|
||||||
def action
|
def action
|
||||||
case params[:id]
|
case params[:id]
|
||||||
when 'slack'
|
when 'slack'
|
||||||
"#{params[:action]}&client_id=#{ENV['SLACK_CLIENT_ID']}&redirect_uri=#{self.class.slack_integration_url}"
|
"#{params[:action]}&client_id=#{ENV.fetch('SLACK_CLIENT_ID', nil)}&redirect_uri=#{self.class.slack_integration_url}"
|
||||||
else
|
else
|
||||||
params[:action]
|
params[:action]
|
||||||
end
|
end
|
||||||
|
@ -57,7 +57,7 @@ class Integrations::App
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.slack_integration_url
|
def self.slack_integration_url
|
||||||
"#{ENV['FRONTEND_URL']}/app/accounts/#{Current.account.id}/settings/integrations/slack"
|
"#{ENV.fetch('FRONTEND_URL', nil)}/app/accounts/#{Current.account.id}/settings/integrations/slack"
|
||||||
end
|
end
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
|
|
|
@ -21,7 +21,7 @@ class Label < ApplicationRecord
|
||||||
belongs_to :account
|
belongs_to :account
|
||||||
|
|
||||||
validates :title,
|
validates :title,
|
||||||
presence: { message: 'must not be blank' },
|
presence: { message: I18n.t('errors.validations.presence') },
|
||||||
format: { with: UNICODE_CHARACTER_NUMBER_HYPHEN_UNDERSCORE },
|
format: { with: UNICODE_CHARACTER_NUMBER_HYPHEN_UNDERSCORE },
|
||||||
uniqueness: { scope: :account_id }
|
uniqueness: { scope: :account_id }
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,7 @@ class Message < ApplicationRecord
|
||||||
# move this to a presenter
|
# move this to a presenter
|
||||||
return self[:content] if !input_csat? || inbox.web_widget?
|
return self[:content] if !input_csat? || inbox.web_widget?
|
||||||
|
|
||||||
I18n.t('conversations.survey.response', link: "#{ENV['FRONTEND_URL']}/survey/responses/#{conversation.uuid}")
|
I18n.t('conversations.survey.response', link: "#{ENV.fetch('FRONTEND_URL', nil)}/survey/responses/#{conversation.uuid}")
|
||||||
end
|
end
|
||||||
|
|
||||||
def email_notifiable_message?
|
def email_notifiable_message?
|
||||||
|
|
|
@ -26,7 +26,7 @@ class Team < ApplicationRecord
|
||||||
has_many :conversations, dependent: :nullify
|
has_many :conversations, dependent: :nullify
|
||||||
|
|
||||||
validates :name,
|
validates :name,
|
||||||
presence: { message: 'must not be blank' },
|
presence: { message: I18n.t('errors.validations.presence') },
|
||||||
uniqueness: { scope: :account_id }
|
uniqueness: { scope: :account_id }
|
||||||
|
|
||||||
before_validation do
|
before_validation do
|
||||||
|
|
|
@ -73,7 +73,7 @@ class Notification::PushNotificationService
|
||||||
return unless ENV['FCM_SERVER_KEY']
|
return unless ENV['FCM_SERVER_KEY']
|
||||||
return unless subscription.fcm?
|
return unless subscription.fcm?
|
||||||
|
|
||||||
fcm = FCM.new(ENV['FCM_SERVER_KEY'])
|
fcm = FCM.new(ENV.fetch('FCM_SERVER_KEY', nil))
|
||||||
response = fcm.send([subscription.subscription_attributes['push_token']], fcm_options)
|
response = fcm.send([subscription.subscription_attributes['push_token']], fcm_options)
|
||||||
remove_subscription_if_error(subscription, response)
|
remove_subscription_if_error(subscription, response)
|
||||||
end
|
end
|
||||||
|
|
|
@ -31,7 +31,7 @@ class Whatsapp::Providers::Whatsapp360DialogService < Whatsapp::Providers::BaseS
|
||||||
"#{api_base_path}/configs/webhook",
|
"#{api_base_path}/configs/webhook",
|
||||||
headers: { 'D360-API-KEY': whatsapp_channel.provider_config['api_key'], 'Content-Type': 'application/json' },
|
headers: { 'D360-API-KEY': whatsapp_channel.provider_config['api_key'], 'Content-Type': 'application/json' },
|
||||||
body: {
|
body: {
|
||||||
url: "#{ENV['FRONTEND_URL']}/webhooks/whatsapp/#{whatsapp_channel.phone_number}"
|
url: "#{ENV.fetch('FRONTEND_URL', nil)}/webhooks/whatsapp/#{whatsapp_channel.phone_number}"
|
||||||
}.to_json
|
}.to_json
|
||||||
)
|
)
|
||||||
response.success?
|
response.success?
|
||||||
|
|
|
@ -28,6 +28,11 @@ module Chatwoot
|
||||||
|
|
||||||
# Custom chatwoot configurations
|
# Custom chatwoot configurations
|
||||||
config.x = config_for(:app).with_indifferent_access
|
config.x = config_for(:app).with_indifferent_access
|
||||||
|
|
||||||
|
# https://stackoverflow.com/questions/72970170/upgrading-to-rails-6-1-6-1-causes-psychdisallowedclass-tried-to-load-unspecif
|
||||||
|
# https://discuss.rubyonrails.org/t/cve-2022-32224-possible-rce-escalation-bug-with-serialized-columns-in-active-record/81017
|
||||||
|
# FIX ME : fixes breakage of installation config. we need to migrate.
|
||||||
|
config.active_record.yaml_column_permitted_classes = [HashWithIndifferentAccess]
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.config
|
def self.config
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
if ENV['DD_TRACE_AGENT_URL']
|
if ENV['DD_TRACE_AGENT_URL']
|
||||||
Datadog.configure do |c|
|
Datadog.configure do |c|
|
||||||
# This will activate auto-instrumentation for Rails
|
# Instrumentation
|
||||||
c.use :rails
|
c.tracing.instrument :rails
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -27,6 +27,6 @@ if ENV['IP_LOOKUP_SERVICE'].present?
|
||||||
if ENV['IP_LOOKUP_SERVICE'] == 'geoip2'
|
if ENV['IP_LOOKUP_SERVICE'] == 'geoip2'
|
||||||
Geocoder.configure(ip_lookup: :geoip2, geoip2: { file: GeocoderConfiguration::LOOK_UP_DB })
|
Geocoder.configure(ip_lookup: :geoip2, geoip2: { file: GeocoderConfiguration::LOOK_UP_DB })
|
||||||
else
|
else
|
||||||
Geocoder.configure(ip_lookup: ENV['IP_LOOKUP_SERVICE'].to_sym, api_key: ENV['IP_LOOKUP_API_KEY'])
|
Geocoder.configure(ip_lookup: ENV['IP_LOOKUP_SERVICE'].to_sym, api_key: ENV.fetch('IP_LOOKUP_API_KEY', nil))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,8 +18,8 @@ Rails.application.configure do
|
||||||
|
|
||||||
smtp_settings[:authentication] = ENV.fetch('SMTP_AUTHENTICATION', 'login').to_sym if ENV['SMTP_AUTHENTICATION'].present?
|
smtp_settings[:authentication] = ENV.fetch('SMTP_AUTHENTICATION', 'login').to_sym if ENV['SMTP_AUTHENTICATION'].present?
|
||||||
smtp_settings[:domain] = ENV['SMTP_DOMAIN'] if ENV['SMTP_DOMAIN'].present?
|
smtp_settings[:domain] = ENV['SMTP_DOMAIN'] if ENV['SMTP_DOMAIN'].present?
|
||||||
smtp_settings[:user_name] = ENV['SMTP_USERNAME']
|
smtp_settings[:user_name] = ENV.fetch('SMTP_USERNAME', nil)
|
||||||
smtp_settings[:password] = ENV['SMTP_PASSWORD']
|
smtp_settings[:password] = ENV.fetch('SMTP_PASSWORD', nil)
|
||||||
smtp_settings[:enable_starttls_auto] = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SMTP_ENABLE_STARTTLS_AUTO', true))
|
smtp_settings[:enable_starttls_auto] = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SMTP_ENABLE_STARTTLS_AUTO', true))
|
||||||
smtp_settings[:openssl_verify_mode] = ENV['SMTP_OPENSSL_VERIFY_MODE'] if ENV['SMTP_OPENSSL_VERIFY_MODE'].present?
|
smtp_settings[:openssl_verify_mode] = ENV['SMTP_OPENSSL_VERIFY_MODE'] if ENV['SMTP_OPENSSL_VERIFY_MODE'].present?
|
||||||
smtp_settings[:ssl] = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SMTP_SSL', true)) if ENV['SMTP_SSL']
|
smtp_settings[:ssl] = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SMTP_SSL', true)) if ENV['SMTP_SSL']
|
||||||
|
|
|
@ -36,6 +36,8 @@ en:
|
||||||
reset_password_failure: Uh ho! We could not find any user with the specified email.
|
reset_password_failure: Uh ho! We could not find any user with the specified email.
|
||||||
|
|
||||||
errors:
|
errors:
|
||||||
|
validations:
|
||||||
|
presence: must not be blank
|
||||||
webhook:
|
webhook:
|
||||||
invalid: Invalid events
|
invalid: Invalid events
|
||||||
signup:
|
signup:
|
||||||
|
@ -43,9 +45,19 @@ en:
|
||||||
invalid_email: You have entered an invalid email
|
invalid_email: You have entered an invalid email
|
||||||
email_already_exists: "You have already signed up for an account with %{email}"
|
email_already_exists: "You have already signed up for an account with %{email}"
|
||||||
failed: Signup failed
|
failed: Signup failed
|
||||||
|
data_import:
|
||||||
|
data_type:
|
||||||
|
invalid: Invalid data type
|
||||||
contacts:
|
contacts:
|
||||||
import:
|
import:
|
||||||
failed: File is blank
|
failed: File is blank
|
||||||
|
email:
|
||||||
|
invalid: Invalid email
|
||||||
|
phone_number:
|
||||||
|
invalid: should be in e164 format
|
||||||
|
categories:
|
||||||
|
locale:
|
||||||
|
unique: should be unique in the category and portal
|
||||||
inboxes:
|
inboxes:
|
||||||
imap:
|
imap:
|
||||||
socket_error: Please check the network connection, IMAP address and try again.
|
socket_error: Please check the network connection, IMAP address and try again.
|
||||||
|
|
|
@ -3,7 +3,7 @@ require 'uri'
|
||||||
|
|
||||||
# Let DATABASE_URL env take presedence over individual connection params.
|
# Let DATABASE_URL env take presedence over individual connection params.
|
||||||
if !ENV['DATABASE_URL'].nil? && ENV['DATABASE_URL'] != ''
|
if !ENV['DATABASE_URL'].nil? && ENV['DATABASE_URL'] != ''
|
||||||
uri = URI(ENV['DATABASE_URL'])
|
uri = URI(ENV.fetch('DATABASE_URL', nil))
|
||||||
puts "export POSTGRES_HOST=#{uri.host} POSTGRES_PORT=#{uri.port} POSTGRES_USERNAME=#{uri.user}"
|
puts "export POSTGRES_HOST=#{uri.host} POSTGRES_PORT=#{uri.port} POSTGRES_USERNAME=#{uri.user}"
|
||||||
elsif ENV['POSTGRES_PORT'].nil? || ENV['POSTGRES_PORT'] == ''
|
elsif ENV['POSTGRES_PORT'].nil? || ENV['POSTGRES_PORT'] == ''
|
||||||
puts 'export POSTGRES_PORT=5432'
|
puts 'export POSTGRES_PORT=5432'
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
class ChatwootHub
|
class ChatwootHub
|
||||||
BASE_URL = ENV['CHATWOOT_HUB_URL'] || 'https://hub.2.chatwoot.com'
|
BASE_URL = ENV.fetch('CHATWOOT_HUB_URL', 'https://hub.2.chatwoot.com')
|
||||||
PING_URL = "#{BASE_URL}/ping".freeze
|
PING_URL = "#{BASE_URL}/ping".freeze
|
||||||
REGISTRATION_URL = "#{BASE_URL}/instances".freeze
|
REGISTRATION_URL = "#{BASE_URL}/instances".freeze
|
||||||
PUSH_NOTIFICATION_URL = "#{BASE_URL}/send_push".freeze
|
PUSH_NOTIFICATION_URL = "#{BASE_URL}/send_push".freeze
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
class GlobalConfigService
|
class GlobalConfigService
|
||||||
def self.load(config_key, default_value)
|
def self.load(config_key, default_value)
|
||||||
config = ENV[config_key] || GlobalConfig.get(config_key)[config_key]
|
config = ENV.fetch(config_key) { GlobalConfig.get(config_key)[config_key] }
|
||||||
return config if config.present?
|
return config if config.present?
|
||||||
|
|
||||||
# To support migrating existing instance relying on env variables
|
# To support migrating existing instance relying on env variables
|
||||||
# TODO: deprecate this later down the line
|
# TODO: deprecate this later down the line
|
||||||
config_value = ENV[config_key] || default_value
|
config_value = ENV.fetch(config_key) { default_value }
|
||||||
|
|
||||||
return if config_value.blank?
|
return if config_value.blank?
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService
|
||||||
end
|
end
|
||||||
|
|
||||||
def avatar_url(sender)
|
def avatar_url(sender)
|
||||||
sender.try(:avatar_url) || "#{ENV['FRONTEND_URL']}/admin/avatar_square.png"
|
sender.try(:avatar_url) || "#{ENV.fetch('FRONTEND_URL', nil)}/admin/avatar_square.png"
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_message
|
def send_message
|
||||||
|
|
|
@ -20,7 +20,7 @@ db_namespace = namespace :db do
|
||||||
# handling case where database was created by the provider, with out running db:setup
|
# handling case where database was created by the provider, with out running db:setup
|
||||||
unless ActiveRecord::Base.connection.table_exists? 'ar_internal_metadata'
|
unless ActiveRecord::Base.connection.table_exists? 'ar_internal_metadata'
|
||||||
db_namespace['load_config'].invoke if ActiveRecord::Base.schema_format == :ruby
|
db_namespace['load_config'].invoke if ActiveRecord::Base.schema_format == :ruby
|
||||||
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
|
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV.fetch('SCHEMA', nil))
|
||||||
db_namespace['seed'].invoke
|
db_namespace['seed'].invoke
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@ class VapidService
|
||||||
# keys don't exist in the database. so let's generate and save them
|
# keys don't exist in the database. so let's generate and save them
|
||||||
keys = Webpush.generate_key
|
keys = Webpush.generate_key
|
||||||
# TODO: remove the logic on environment variables when we completely deprecate
|
# TODO: remove the logic on environment variables when we completely deprecate
|
||||||
public_key = ENV['VAPID_PUBLIC_KEY'] || keys.public_key
|
public_key = ENV.fetch('VAPID_PUBLIC_KEY') { keys.public_key }
|
||||||
private_key = ENV['VAPID_PRIVATE_KEY'] || keys.private_key
|
private_key = ENV.fetch('VAPID_PRIVATE_KEY') { keys.private_key }
|
||||||
|
|
||||||
i = InstallationConfig.where(name: 'VAPID_KEYS').first_or_create(value: { public_key: public_key, private_key: private_key })
|
i = InstallationConfig.where(name: 'VAPID_KEYS').first_or_create(value: { public_key: public_key, private_key: private_key })
|
||||||
i.value
|
i.value
|
||||||
|
|
|
@ -62,7 +62,7 @@ describe ::ContactIdentifyAction do
|
||||||
result = described_class.new(contact: contact, params: params).perform
|
result = described_class.new(contact: contact, params: params).perform
|
||||||
expect(result.id).not_to eq existing_email_contact.id
|
expect(result.id).not_to eq existing_email_contact.id
|
||||||
expect(result.identifier).to eq params[:identifier]
|
expect(result.identifier).to eq params[:identifier]
|
||||||
expect(result.email).to eq nil
|
expect(result.email).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ describe ::ContactIdentifyAction do
|
||||||
result = described_class.new(contact: contact, params: params).perform
|
result = described_class.new(contact: contact, params: params).perform
|
||||||
expect(result.id).not_to eq existing_phone_number_contact.id
|
expect(result.id).not_to eq existing_phone_number_contact.id
|
||||||
expect(result.identifier).to eq params[:identifier]
|
expect(result.identifier).to eq params[:identifier]
|
||||||
expect(result.email).to eq nil
|
expect(result.email).to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'will not overide the phone contacts email when params contains different email' do
|
it 'will not overide the phone contacts email when params contains different email' do
|
||||||
|
@ -91,7 +91,7 @@ describe ::ContactIdentifyAction do
|
||||||
result = described_class.new(contact: contact, params: params).perform
|
result = described_class.new(contact: contact, params: params).perform
|
||||||
expect(result.id).not_to eq existing_phone_number_contact.id
|
expect(result.id).not_to eq existing_phone_number_contact.id
|
||||||
expect(result.email).to eq params[:email]
|
expect(result.email).to eq params[:email]
|
||||||
expect(result.phone_number).to eq nil
|
expect(result.phone_number).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ describe ::ContactIdentifyAction do
|
||||||
params = { phone_number: 'blahblah blah', name: 'new name' }
|
params = { phone_number: 'blahblah blah', name: 'new name' }
|
||||||
described_class.new(contact: contact, params: params, discard_invalid_attrs: true).perform
|
described_class.new(contact: contact, params: params, discard_invalid_attrs: true).perform
|
||||||
expect(contact.reload.name).to eq 'new name'
|
expect(contact.reload.name).to eq 'new name'
|
||||||
expect(contact.phone_number).to eq nil
|
expect(contact.phone_number).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -43,7 +43,7 @@ describe ::ContactMergeAction do
|
||||||
it 'does not delete contact' do
|
it 'does not delete contact' do
|
||||||
mergee_contact = base_contact
|
mergee_contact = base_contact
|
||||||
contact_merge
|
contact_merge
|
||||||
expect(mergee_contact.reload).not_to eq nil
|
expect(mergee_contact.reload).not_to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ describe ::Campaigns::CampaignConversationBuilder do
|
||||||
campaign_display_id: campaign.display_id
|
campaign_display_id: campaign.display_id
|
||||||
).perform
|
).perform
|
||||||
|
|
||||||
expect(campaign_conversation).to eq(nil)
|
expect(campaign_conversation).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -226,7 +226,7 @@ describe ::ContactInboxBuilder do
|
||||||
inbox_id: api_inbox.id
|
inbox_id: api_inbox.id
|
||||||
).perform
|
).perform
|
||||||
|
|
||||||
expect(contact_inbox.source_id).not_to be(nil)
|
expect(contact_inbox.source_id).not_to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -241,7 +241,7 @@ describe ::ContactInboxBuilder do
|
||||||
source_id: 'test'
|
source_id: 'test'
|
||||||
).perform
|
).perform
|
||||||
|
|
||||||
expect(contact_inbox).to be(nil)
|
expect(contact_inbox).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -260,7 +260,7 @@ describe ::ContactInboxBuilder do
|
||||||
source_id: 'test'
|
source_id: 'test'
|
||||||
).perform
|
).perform
|
||||||
|
|
||||||
expect(contact_inbox).to be(nil)
|
expect(contact_inbox).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -275,7 +275,7 @@ describe ::ContactInboxBuilder do
|
||||||
source_id: 'test'
|
source_id: 'test'
|
||||||
).perform
|
).perform
|
||||||
|
|
||||||
expect(contact_inbox).to be(nil)
|
expect(contact_inbox).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,7 +14,7 @@ describe ::CsatSurveys::ResponseBuilder do
|
||||||
message: message
|
message: message
|
||||||
).perform
|
).perform
|
||||||
|
|
||||||
expect(csat_survey_response.valid?).to eq(true)
|
expect(csat_survey_response.valid?).to be(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'updates the value of csat survey response if response already exists' do
|
it 'updates the value of csat survey response if response already exists' do
|
||||||
|
|
|
@ -69,7 +69,7 @@ RSpec.describe 'Agent Bot API', type: :request do
|
||||||
|
|
||||||
context 'when it is an unauthenticated user' do
|
context 'when it is an unauthenticated user' do
|
||||||
it 'returns unauthorized' do
|
it 'returns unauthorized' do
|
||||||
expect { post "/api/v1/accounts/#{account.id}/agent_bots", params: valid_params }.to change(Label, :count).by(0)
|
expect { post "/api/v1/accounts/#{account.id}/agent_bots", params: valid_params }.not_to change(Label, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:unauthorized)
|
expect(response).to have_http_status(:unauthorized)
|
||||||
end
|
end
|
||||||
|
@ -89,7 +89,7 @@ RSpec.describe 'Agent Bot API', type: :request do
|
||||||
expect do
|
expect do
|
||||||
post "/api/v1/accounts/#{account.id}/agent_bots", headers: agent.create_new_auth_token,
|
post "/api/v1/accounts/#{account.id}/agent_bots", headers: agent.create_new_auth_token,
|
||||||
params: valid_params
|
params: valid_params
|
||||||
end.to change(AgentBot, :count).by(0)
|
end.not_to change(AgentBot, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:unauthorized)
|
expect(response).to have_http_status(:unauthorized)
|
||||||
end
|
end
|
||||||
|
|
|
@ -114,7 +114,7 @@ RSpec.describe 'Agents API', type: :request do
|
||||||
response_data = JSON.parse(response.body)
|
response_data = JSON.parse(response.body)
|
||||||
expect(response_data['role']).to eq('administrator')
|
expect(response_data['role']).to eq('administrator')
|
||||||
expect(response_data['availability_status']).to eq('busy')
|
expect(response_data['availability_status']).to eq('busy')
|
||||||
expect(response_data['auto_offline']).to eq(false)
|
expect(response_data['auto_offline']).to be(false)
|
||||||
expect(other_agent.account_users.first.role).to eq('administrator')
|
expect(other_agent.account_users.first.role).to eq('administrator')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -137,7 +137,7 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
||||||
headers: agent.create_new_auth_token
|
headers: agent.create_new_auth_token
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
deleted_article = Article.find_by(id: article.id)
|
deleted_article = Article.find_by(id: article.id)
|
||||||
expect(deleted_article).to be nil
|
expect(deleted_article).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -153,7 +153,7 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
||||||
context 'when it is an authenticated user' do
|
context 'when it is an authenticated user' do
|
||||||
it 'get all articles' do
|
it 'get all articles' do
|
||||||
article2 = create(:article, account_id: account.id, portal: portal, category: category, author_id: agent.id)
|
article2 = create(:article, account_id: account.id, portal: portal, category: category, author_id: agent.id)
|
||||||
expect(article2.id).not_to be nil
|
expect(article2.id).not_to be_nil
|
||||||
|
|
||||||
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
|
@ -165,7 +165,7 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
||||||
|
|
||||||
it 'get all articles with searched params' do
|
it 'get all articles with searched params' do
|
||||||
article2 = create(:article, account_id: account.id, portal: portal, category: category, author_id: agent.id)
|
article2 = create(:article, account_id: account.id, portal: portal, category: category, author_id: agent.id)
|
||||||
expect(article2.id).not_to be nil
|
expect(article2.id).not_to be_nil
|
||||||
|
|
||||||
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
|
@ -182,7 +182,7 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
||||||
category: category,
|
category: category,
|
||||||
author_id: agent.id,
|
author_id: agent.id,
|
||||||
content: 'this is some test and funny content')
|
content: 'this is some test and funny content')
|
||||||
expect(article2.id).not_to be nil
|
expect(article2.id).not_to be_nil
|
||||||
|
|
||||||
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
|
@ -196,7 +196,7 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
||||||
describe 'GET /api/v1/accounts/{account.id}/portals/{portal.slug}/articles/{article.id}' do
|
describe 'GET /api/v1/accounts/{account.id}/portals/{portal.slug}/articles/{article.id}' do
|
||||||
it 'get article' do
|
it 'get article' do
|
||||||
article2 = create(:article, account_id: account.id, portal: portal, category: category, author_id: agent.id)
|
article2 = create(:article, account_id: account.id, portal: portal, category: category, author_id: agent.id)
|
||||||
expect(article2.id).not_to be nil
|
expect(article2.id).not_to be_nil
|
||||||
|
|
||||||
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles/#{article2.id}",
|
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles/#{article2.id}",
|
||||||
headers: agent.create_new_auth_token
|
headers: agent.create_new_auth_token
|
||||||
|
|
|
@ -307,7 +307,7 @@ RSpec.describe 'Api::V1::Accounts::AutomationRulesController', type: :request do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns for updated active flag for automation_rule' do
|
it 'returns for updated active flag for automation_rule' do
|
||||||
expect(automation_rule.active).to eq(true)
|
expect(automation_rule.active).to be(true)
|
||||||
params = { active: false }
|
params = { active: false }
|
||||||
|
|
||||||
patch "/api/v1/accounts/#{account.id}/automation_rules/#{automation_rule.id}",
|
patch "/api/v1/accounts/#{account.id}/automation_rules/#{automation_rule.id}",
|
||||||
|
@ -316,8 +316,8 @@ RSpec.describe 'Api::V1::Accounts::AutomationRulesController', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
body = JSON.parse(response.body, symbolize_names: true)
|
body = JSON.parse(response.body, symbolize_names: true)
|
||||||
expect(body[:payload][:active]).to eq(false)
|
expect(body[:payload][:active]).to be(false)
|
||||||
expect(automation_rule.reload.active).to eq(false)
|
expect(automation_rule.reload.active).to be(false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -40,7 +40,7 @@ RSpec.describe 'Api::V1::Accounts::BulkActionsController', type: :request do
|
||||||
it 'Bulk update conversation status' do
|
it 'Bulk update conversation status' do
|
||||||
expect(Conversation.first.status).to eq('open')
|
expect(Conversation.first.status).to eq('open')
|
||||||
expect(Conversation.last.status).to eq('open')
|
expect(Conversation.last.status).to eq('open')
|
||||||
expect(Conversation.first.assignee_id).to eq(nil)
|
expect(Conversation.first.assignee_id).to be_nil
|
||||||
|
|
||||||
perform_enqueued_jobs do
|
perform_enqueued_jobs do
|
||||||
post "/api/v1/accounts/#{account.id}/bulk_actions",
|
post "/api/v1/accounts/#{account.id}/bulk_actions",
|
||||||
|
@ -52,15 +52,15 @@ RSpec.describe 'Api::V1::Accounts::BulkActionsController', type: :request do
|
||||||
|
|
||||||
expect(Conversation.first.status).to eq('snoozed')
|
expect(Conversation.first.status).to eq('snoozed')
|
||||||
expect(Conversation.last.status).to eq('open')
|
expect(Conversation.last.status).to eq('open')
|
||||||
expect(Conversation.first.assignee_id).to eq(nil)
|
expect(Conversation.first.assignee_id).to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'Bulk update conversation assignee id' do
|
it 'Bulk update conversation assignee id' do
|
||||||
params = { type: 'Conversation', fields: { assignee_id: agent_1.id }, ids: Conversation.first(3).pluck(:display_id) }
|
params = { type: 'Conversation', fields: { assignee_id: agent_1.id }, ids: Conversation.first(3).pluck(:display_id) }
|
||||||
|
|
||||||
expect(Conversation.first.status).to eq('open')
|
expect(Conversation.first.status).to eq('open')
|
||||||
expect(Conversation.first.assignee_id).to eq(nil)
|
expect(Conversation.first.assignee_id).to be_nil
|
||||||
expect(Conversation.second.assignee_id).to eq(nil)
|
expect(Conversation.second.assignee_id).to be_nil
|
||||||
|
|
||||||
perform_enqueued_jobs do
|
perform_enqueued_jobs do
|
||||||
post "/api/v1/accounts/#{account.id}/bulk_actions",
|
post "/api/v1/accounts/#{account.id}/bulk_actions",
|
||||||
|
@ -79,7 +79,7 @@ RSpec.describe 'Api::V1::Accounts::BulkActionsController', type: :request do
|
||||||
params = { type: 'Conversation', fields: { assignee_id: agent_1.id, status: 'snoozed' }, ids: Conversation.first(3).pluck(:display_id) }
|
params = { type: 'Conversation', fields: { assignee_id: agent_1.id, status: 'snoozed' }, ids: Conversation.first(3).pluck(:display_id) }
|
||||||
|
|
||||||
expect(Conversation.first.status).to eq('open')
|
expect(Conversation.first.status).to eq('open')
|
||||||
expect(Conversation.second.assignee_id).to eq(nil)
|
expect(Conversation.second.assignee_id).to be_nil
|
||||||
|
|
||||||
perform_enqueued_jobs do
|
perform_enqueued_jobs do
|
||||||
post "/api/v1/accounts/#{account.id}/bulk_actions",
|
post "/api/v1/accounts/#{account.id}/bulk_actions",
|
||||||
|
|
|
@ -145,7 +145,7 @@ RSpec.describe 'Campaigns API', type: :request do
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
response_data = JSON.parse(response.body, symbolize_names: true)
|
response_data = JSON.parse(response.body, symbolize_names: true)
|
||||||
expect(response_data[:campaign_type]).to eq('one_off')
|
expect(response_data[:campaign_type]).to eq('one_off')
|
||||||
expect(response_data[:scheduled_at].present?).to eq true
|
expect(response_data[:scheduled_at].present?).to be true
|
||||||
expect(response_data[:scheduled_at]).to eq(scheduled_at.to_i)
|
expect(response_data[:scheduled_at]).to eq(scheduled_at.to_i)
|
||||||
expect(response_data[:audience].pluck(:id)).to include(label1.id, label2.id)
|
expect(response_data[:audience].pluck(:id)).to include(label1.id, label2.id)
|
||||||
end
|
end
|
||||||
|
@ -222,7 +222,7 @@ RSpec.describe 'Campaigns API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(::Campaign.exists?(campaign.display_id)).to eq false
|
expect(::Campaign.exists?(campaign.display_id)).to be false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -228,7 +228,7 @@ RSpec.describe 'Api::V1::Accounts::Categories', type: :request do
|
||||||
headers: agent.create_new_auth_token
|
headers: agent.create_new_auth_token
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
deleted_category = Category.find_by(id: category.id)
|
deleted_category = Category.find_by(id: category.id)
|
||||||
expect(deleted_category).to be nil
|
expect(deleted_category).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -247,7 +247,7 @@ RSpec.describe 'Api::V1::Accounts::Categories', type: :request do
|
||||||
|
|
||||||
category2 = create(:category, name: 'test_category_2', portal: portal, locale: 'es', slug: 'category_slug_2')
|
category2 = create(:category, name: 'test_category_2', portal: portal, locale: 'es', slug: 'category_slug_2')
|
||||||
|
|
||||||
expect(category2.id).not_to be nil
|
expect(category2.id).not_to be_nil
|
||||||
|
|
||||||
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/categories",
|
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/categories",
|
||||||
headers: agent.create_new_auth_token
|
headers: agent.create_new_auth_token
|
||||||
|
|
|
@ -5,7 +5,7 @@ RSpec.describe '/api/v1/accounts/{account.id}/channels/twilio_channel', type: :r
|
||||||
let(:admin) { create(:user, account: account, role: :administrator) }
|
let(:admin) { create(:user, account: account, role: :administrator) }
|
||||||
let(:agent) { create(:user, account: account, role: :agent) }
|
let(:agent) { create(:user, account: account, role: :agent) }
|
||||||
let(:twilio_client) { instance_double(::Twilio::REST::Client) }
|
let(:twilio_client) { instance_double(::Twilio::REST::Client) }
|
||||||
let(:message_double) { instance_double('message') }
|
let(:message_double) { double }
|
||||||
let(:twilio_webhook_setup_service) { instance_double(::Twilio::WebhookSetupService) }
|
let(:twilio_webhook_setup_service) { instance_double(::Twilio::WebhookSetupService) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -36,7 +36,7 @@ RSpec.describe '/api/v1/accounts/{account.id}/contacts/:id/contact_inboxes', typ
|
||||||
params: { inbox_id: channel_twilio_sms.inbox.id },
|
params: { inbox_id: channel_twilio_sms.inbox.id },
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
as: :json
|
as: :json
|
||||||
end.to change(ContactInbox, :count).by(0)
|
end.not_to change(ContactInbox, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:unprocessable_entity)
|
expect(response).to have_http_status(:unprocessable_entity)
|
||||||
end
|
end
|
||||||
|
|
|
@ -114,7 +114,7 @@ RSpec.describe 'Notes API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(::Note.exists?(note.id)).to eq false
|
expect(::Note.exists?(note.id)).to be false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -49,7 +49,7 @@ RSpec.describe 'Contacts API', type: :request do
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
response_body = JSON.parse(response.body)
|
response_body = JSON.parse(response.body)
|
||||||
expect(response_body['payload'].first['email']).to eq(contact.email)
|
expect(response_body['payload'].first['email']).to eq(contact.email)
|
||||||
expect(response_body['payload'].first['contact_inboxes'].blank?).to eq(true)
|
expect(response_body['payload'].first['contact_inboxes'].blank?).to be(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns all contacts with company name desc order' do
|
it 'returns all contacts with company name desc order' do
|
||||||
|
@ -149,7 +149,7 @@ RSpec.describe 'Contacts API', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(account.data_imports.count).to eq(1)
|
expect(account.data_imports.count).to eq(1)
|
||||||
expect(account.data_imports.first.import_file.attached?).to eq(true)
|
expect(account.data_imports.first.import_file.attached?).to be(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -364,7 +364,7 @@ RSpec.describe 'Contacts API', type: :request do
|
||||||
|
|
||||||
context 'when it is an unauthenticated user' do
|
context 'when it is an unauthenticated user' do
|
||||||
it 'returns unauthorized' do
|
it 'returns unauthorized' do
|
||||||
expect { post "/api/v1/accounts/#{account.id}/contacts", params: valid_params }.to change(Contact, :count).by(0)
|
expect { post "/api/v1/accounts/#{account.id}/contacts", params: valid_params }.not_to change(Contact, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:unauthorized)
|
expect(response).to have_http_status(:unauthorized)
|
||||||
end
|
end
|
||||||
|
@ -477,7 +477,7 @@ RSpec.describe 'Contacts API', type: :request do
|
||||||
|
|
||||||
it 'updates avatar' do
|
it 'updates avatar' do
|
||||||
# no avatar before upload
|
# no avatar before upload
|
||||||
expect(contact.avatar.attached?).to eq(false)
|
expect(contact.avatar.attached?).to be(false)
|
||||||
file = fixture_file_upload(Rails.root.join('spec/assets/avatar.png'), 'image/png')
|
file = fixture_file_upload(Rails.root.join('spec/assets/avatar.png'), 'image/png')
|
||||||
patch "/api/v1/accounts/#{account.id}/contacts/#{contact.id}",
|
patch "/api/v1/accounts/#{account.id}/contacts/#{contact.id}",
|
||||||
params: valid_params.merge(avatar: file),
|
params: valid_params.merge(avatar: file),
|
||||||
|
@ -485,7 +485,7 @@ RSpec.describe 'Contacts API', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
contact.reload
|
contact.reload
|
||||||
expect(contact.avatar.attached?).to eq(true)
|
expect(contact.avatar.attached?).to be(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -68,7 +68,7 @@ RSpec.describe 'Conversation Assignment API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.reload.assignee).to eq(nil)
|
expect(conversation.reload.assignee).to be_nil
|
||||||
expect(Conversations::ActivityMessageJob)
|
expect(Conversations::ActivityMessageJob)
|
||||||
.to(have_been_enqueued.at_least(:once)
|
.to(have_been_enqueued.at_least(:once)
|
||||||
.with(conversation, { account_id: conversation.account_id, inbox_id: conversation.inbox_id, message_type: :activity,
|
.with(conversation, { account_id: conversation.account_id, inbox_id: conversation.inbox_id, message_type: :activity,
|
||||||
|
@ -93,7 +93,7 @@ RSpec.describe 'Conversation Assignment API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.reload.team).to eq(nil)
|
expect(conversation.reload.team).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -77,7 +77,7 @@ RSpec.describe 'Conversation Messages API', type: :request do
|
||||||
headers: agent.create_new_auth_token
|
headers: agent.create_new_auth_token
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.messages.last.attachments.first.file.present?).to eq(true)
|
expect(conversation.messages.last.attachments.first.file.present?).to be(true)
|
||||||
expect(conversation.messages.last.attachments.first.file_type).to eq('image')
|
expect(conversation.messages.last.attachments.first.file_type).to eq('image')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -113,7 +113,7 @@ RSpec.describe 'Conversation Messages API', type: :request do
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.messages.count).to eq(1)
|
expect(conversation.messages.count).to eq(1)
|
||||||
expect(conversation.messages.first.content_type).to eq(params[:content_type])
|
expect(conversation.messages.first.content_type).to eq(params[:content_type])
|
||||||
expect(conversation.messages.first.content).to eq nil
|
expect(conversation.messages.first.content).to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'creates a new outgoing cards message' do
|
it 'creates a new outgoing cards message' do
|
||||||
|
@ -187,8 +187,8 @@ RSpec.describe 'Conversation Messages API', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(message.reload.content).to eq 'This message was deleted'
|
expect(message.reload.content).to eq 'This message was deleted'
|
||||||
expect(message.reload.deleted).to eq true
|
expect(message.reload.deleted).to be true
|
||||||
expect(message.reload.content_attributes['bcc_emails']).to eq nil
|
expect(message.reload.content_attributes['bcc_emails']).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -490,20 +490,20 @@ RSpec.describe 'Conversations API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.reload.agent_last_seen_at).not_to eq nil
|
expect(conversation.reload.agent_last_seen_at).not_to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'updates assignee last seen' do
|
it 'updates assignee last seen' do
|
||||||
conversation.update!(assignee_id: agent.id)
|
conversation.update!(assignee_id: agent.id)
|
||||||
|
|
||||||
expect(conversation.reload.assignee_last_seen_at).to eq nil
|
expect(conversation.reload.assignee_last_seen_at).to be_nil
|
||||||
|
|
||||||
post "/api/v1/accounts/#{account.id}/conversations/#{conversation.display_id}/update_last_seen",
|
post "/api/v1/accounts/#{account.id}/conversations/#{conversation.display_id}/update_last_seen",
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.reload.assignee_last_seen_at).not_to eq nil
|
expect(conversation.reload.assignee_last_seen_at).not_to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -532,8 +532,8 @@ RSpec.describe 'Conversations API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.reload.resolved?).to eq(true)
|
expect(conversation.reload.resolved?).to be(true)
|
||||||
expect(conversation.reload.muted?).to eq(true)
|
expect(conversation.reload.muted?).to be(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -562,7 +562,7 @@ RSpec.describe 'Conversations API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.reload.muted?).to eq(false)
|
expect(conversation.reload.muted?).to be(false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -636,7 +636,7 @@ RSpec.describe 'Conversations API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.reload.custom_attributes).not_to eq nil
|
expect(conversation.reload.custom_attributes).not_to be_nil
|
||||||
expect(conversation.reload.custom_attributes.count).to eq 3
|
expect(conversation.reload.custom_attributes.count).to eq 3
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -72,7 +72,7 @@ RSpec.describe 'Custom Attribute Definitions API', type: :request do
|
||||||
expect do
|
expect do
|
||||||
post "/api/v1/accounts/#{account.id}/custom_attribute_definitions",
|
post "/api/v1/accounts/#{account.id}/custom_attribute_definitions",
|
||||||
params: payload
|
params: payload
|
||||||
end.to change(CustomAttributeDefinition, :count).by(0)
|
end.not_to change(CustomAttributeDefinition, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:unauthorized)
|
expect(response).to have_http_status(:unauthorized)
|
||||||
end
|
end
|
||||||
|
|
|
@ -58,7 +58,7 @@ RSpec.describe 'Custom Filters API', type: :request do
|
||||||
|
|
||||||
context 'when it is an unauthenticated user' do
|
context 'when it is an unauthenticated user' do
|
||||||
it 'returns unauthorized' do
|
it 'returns unauthorized' do
|
||||||
expect { post "/api/v1/accounts/#{account.id}/custom_filters", params: payload }.to change(CustomFilter, :count).by(0)
|
expect { post "/api/v1/accounts/#{account.id}/custom_filters", params: payload }.not_to change(CustomFilter, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:unauthorized)
|
expect(response).to have_http_status(:unauthorized)
|
||||||
end
|
end
|
||||||
|
|
|
@ -60,7 +60,7 @@ RSpec.describe 'DashboardAppsController', type: :request do
|
||||||
|
|
||||||
context 'when it is an unauthenticated user' do
|
context 'when it is an unauthenticated user' do
|
||||||
it 'returns unauthorized' do
|
it 'returns unauthorized' do
|
||||||
expect { post "/api/v1/accounts/#{account.id}/dashboard_apps", params: payload }.to change(CustomFilter, :count).by(0)
|
expect { post "/api/v1/accounts/#{account.id}/dashboard_apps", params: payload }.not_to change(CustomFilter, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:unauthorized)
|
expect(response).to have_http_status(:unauthorized)
|
||||||
end
|
end
|
||||||
|
@ -86,7 +86,7 @@ RSpec.describe 'DashboardAppsController', type: :request do
|
||||||
expect do
|
expect do
|
||||||
post "/api/v1/accounts/#{account.id}/dashboard_apps", headers: user.create_new_auth_token,
|
post "/api/v1/accounts/#{account.id}/dashboard_apps", headers: user.create_new_auth_token,
|
||||||
params: invalid_url_payload
|
params: invalid_url_payload
|
||||||
end.to change(DashboardApp, :count).by(0)
|
end.not_to change(DashboardApp, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:unprocessable_entity)
|
expect(response).to have_http_status(:unprocessable_entity)
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
|
@ -97,7 +97,7 @@ RSpec.describe 'DashboardAppsController', type: :request do
|
||||||
expect do
|
expect do
|
||||||
post "/api/v1/accounts/#{account.id}/dashboard_apps", headers: user.create_new_auth_token,
|
post "/api/v1/accounts/#{account.id}/dashboard_apps", headers: user.create_new_auth_token,
|
||||||
params: invalid_type_payload
|
params: invalid_type_payload
|
||||||
end.to change(DashboardApp, :count).by(0)
|
end.not_to change(DashboardApp, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:unprocessable_entity)
|
expect(response).to have_http_status(:unprocessable_entity)
|
||||||
end
|
end
|
||||||
|
|
|
@ -414,7 +414,7 @@ RSpec.describe 'Inboxes API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(api_channel.reload.tweets_enabled).to eq(false)
|
expect(api_channel.reload.tweets_enabled).to be(false)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'updates email inbox when administrator' do
|
it 'updates email inbox when administrator' do
|
||||||
|
@ -458,7 +458,7 @@ RSpec.describe 'Inboxes API', type: :request do
|
||||||
|
|
||||||
it 'updates avatar when administrator' do
|
it 'updates avatar when administrator' do
|
||||||
# no avatar before upload
|
# no avatar before upload
|
||||||
expect(inbox.avatar.attached?).to eq(false)
|
expect(inbox.avatar.attached?).to be(false)
|
||||||
file = fixture_file_upload(Rails.root.join('spec/assets/avatar.png'), 'image/png')
|
file = fixture_file_upload(Rails.root.join('spec/assets/avatar.png'), 'image/png')
|
||||||
patch "/api/v1/accounts/#{account.id}/inboxes/#{inbox.id}",
|
patch "/api/v1/accounts/#{account.id}/inboxes/#{inbox.id}",
|
||||||
params: valid_params.merge(avatar: file),
|
params: valid_params.merge(avatar: file),
|
||||||
|
@ -466,7 +466,7 @@ RSpec.describe 'Inboxes API', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
inbox.reload
|
inbox.reload
|
||||||
expect(inbox.avatar.attached?).to eq(true)
|
expect(inbox.avatar.attached?).to be(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'updates working hours when administrator' do
|
it 'updates working hours when administrator' do
|
||||||
|
@ -613,7 +613,7 @@ RSpec.describe 'Inboxes API', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
inbox_data = JSON.parse(response.body, symbolize_names: true)
|
inbox_data = JSON.parse(response.body, symbolize_names: true)
|
||||||
expect(inbox_data[:agent_bot].blank?).to eq(true)
|
expect(inbox_data[:agent_bot].blank?).to be(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns the agent bot attached to the inbox' do
|
it 'returns the agent bot attached to the inbox' do
|
||||||
|
|
|
@ -104,7 +104,7 @@ RSpec.describe 'Integration Hooks API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(::Integrations::Hook.exists?(hook.id)).to eq false
|
expect(::Integrations::Hook.exists?(hook.id)).to be false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -55,7 +55,7 @@ RSpec.describe 'Label API', type: :request do
|
||||||
|
|
||||||
context 'when it is an unauthenticated user' do
|
context 'when it is an unauthenticated user' do
|
||||||
it 'returns unauthorized' do
|
it 'returns unauthorized' do
|
||||||
expect { post "/api/v1/accounts/#{account.id}/labels", params: valid_params }.to change(Label, :count).by(0)
|
expect { post "/api/v1/accounts/#{account.id}/labels", params: valid_params }.not_to change(Label, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:unauthorized)
|
expect(response).to have_http_status(:unauthorized)
|
||||||
end
|
end
|
||||||
|
|
|
@ -70,7 +70,7 @@ RSpec.describe 'Notifications API', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(notification1.reload.read_at).not_to eq('')
|
expect(notification1.reload.read_at).not_to eq('')
|
||||||
expect(notification2.reload.read_at).to eq nil
|
expect(notification2.reload.read_at).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -21,7 +21,7 @@ RSpec.describe 'Api::V1::Accounts::Portals', type: :request do
|
||||||
context 'when it is an authenticated user' do
|
context 'when it is an authenticated user' do
|
||||||
it 'get all portals' do
|
it 'get all portals' do
|
||||||
portal2 = create(:portal, name: 'test_portal_2', account_id: account.id, slug: 'portal-2')
|
portal2 = create(:portal, name: 'test_portal_2', account_id: account.id, slug: 'portal-2')
|
||||||
expect(portal2.id).not_to be nil
|
expect(portal2.id).not_to be_nil
|
||||||
get "/api/v1/accounts/#{account.id}/portals",
|
get "/api/v1/accounts/#{account.id}/portals",
|
||||||
headers: agent.create_new_auth_token
|
headers: agent.create_new_auth_token
|
||||||
|
|
||||||
|
@ -155,7 +155,7 @@ RSpec.describe 'Api::V1::Accounts::Portals', type: :request do
|
||||||
headers: admin.create_new_auth_token
|
headers: admin.create_new_auth_token
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
deleted_portal = Portal.find_by(id: portal.slug)
|
deleted_portal = Portal.find_by(id: portal.slug)
|
||||||
expect(deleted_portal).to be nil
|
expect(deleted_portal).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -206,14 +206,14 @@ RSpec.describe 'Accounts API', type: :request do
|
||||||
|
|
||||||
context 'when it is an authenticated user' do
|
context 'when it is an authenticated user' do
|
||||||
it 'modifies an account' do
|
it 'modifies an account' do
|
||||||
expect(agent.account_users.first.active_at).to eq(nil)
|
expect(agent.account_users.first.active_at).to be_nil
|
||||||
post "/api/v1/accounts/#{account.id}/update_active_at",
|
post "/api/v1/accounts/#{account.id}/update_active_at",
|
||||||
params: {},
|
params: {},
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(agent.account_users.first.active_at).not_to eq(nil)
|
expect(agent.account_users.first.active_at).not_to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -79,7 +79,7 @@ RSpec.describe 'Profile API', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(agent.reload.valid_password?('Test1234!')).to eq true
|
expect(agent.reload.valid_password?('Test1234!')).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'throws error when current password provided is invalid' do
|
it 'throws error when current password provided is invalid' do
|
||||||
|
@ -105,7 +105,7 @@ RSpec.describe 'Profile API', type: :request do
|
||||||
|
|
||||||
it 'updates avatar' do
|
it 'updates avatar' do
|
||||||
# no avatar before upload
|
# no avatar before upload
|
||||||
expect(agent.avatar.attached?).to eq(false)
|
expect(agent.avatar.attached?).to be(false)
|
||||||
file = fixture_file_upload(Rails.root.join('spec/assets/avatar.png'), 'image/png')
|
file = fixture_file_upload(Rails.root.join('spec/assets/avatar.png'), 'image/png')
|
||||||
put '/api/v1/profile',
|
put '/api/v1/profile',
|
||||||
params: { profile: { avatar: file } },
|
params: { profile: { avatar: file } },
|
||||||
|
@ -113,7 +113,7 @@ RSpec.describe 'Profile API', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
agent.reload
|
agent.reload
|
||||||
expect(agent.avatar.attached?).to eq(true)
|
expect(agent.avatar.attached?).to be(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'updates the ui settings' do
|
it 'updates the ui settings' do
|
||||||
|
@ -124,7 +124,7 @@ RSpec.describe 'Profile API', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
expect(json_response['ui_settings']['is_contact_sidebar_open']).to eq(false)
|
expect(json_response['ui_settings']['is_contact_sidebar_open']).to be(false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ RSpec.describe '/api/v1/widget/config', type: :request do
|
||||||
params: params,
|
params: params,
|
||||||
headers: { 'X-Auth-Token' => token },
|
headers: { 'X-Auth-Token' => token },
|
||||||
as: :json
|
as: :json
|
||||||
end.to change(Contact, :count).by(0)
|
end.not_to change(Contact, :count)
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
response_data = JSON.parse(response.body)
|
response_data = JSON.parse(response.body)
|
||||||
|
|
|
@ -103,8 +103,8 @@ RSpec.describe '/api/v1/widget/contacts', type: :request do
|
||||||
|
|
||||||
body = JSON.parse(response.body)
|
body = JSON.parse(response.body)
|
||||||
expect(body['id']).not_to eq(contact.id)
|
expect(body['id']).not_to eq(contact.id)
|
||||||
expect(body['widget_auth_token']).not_to eq(nil)
|
expect(body['widget_auth_token']).not_to be_nil
|
||||||
expect(Contact.find(body['id']).contact_inboxes.first.hmac_verified?).to eq(true)
|
expect(Contact.find(body['id']).contact_inboxes.first.hmac_verified?).to be(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,7 @@ RSpec.describe '/api/v1/widget/conversations/toggle_typing', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
expect(json_response['id']).not_to eq nil
|
expect(json_response['id']).not_to be_nil
|
||||||
expect(json_response['contact']['email']).to eq 'contact-email@chatwoot.com'
|
expect(json_response['contact']['email']).to eq 'contact-email@chatwoot.com'
|
||||||
expect(json_response['contact']['phone_number']).to eq '+919745313456'
|
expect(json_response['contact']['phone_number']).to eq '+919745313456'
|
||||||
expect(json_response['contact']['name']).to eq 'contact-name'
|
expect(json_response['contact']['name']).to eq 'contact-name'
|
||||||
|
@ -95,7 +95,7 @@ RSpec.describe '/api/v1/widget/conversations/toggle_typing', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
expect(json_response['id']).not_to eq nil
|
expect(json_response['id']).not_to be_nil
|
||||||
expect(json_response['contact']['email']).to eq existing_contact.email
|
expect(json_response['contact']['email']).to eq existing_contact.email
|
||||||
expect(json_response['contact']['name']).not_to eq 'contact-name'
|
expect(json_response['contact']['name']).not_to eq 'contact-name'
|
||||||
expect(json_response['contact']['phone_number']).to eq '+919745313456'
|
expect(json_response['contact']['phone_number']).to eq '+919745313456'
|
||||||
|
@ -124,7 +124,7 @@ RSpec.describe '/api/v1/widget/conversations/toggle_typing', type: :request do
|
||||||
context 'with a conversation' do
|
context 'with a conversation' do
|
||||||
it 'returns the correct conversation params' do
|
it 'returns the correct conversation params' do
|
||||||
allow(Rails.configuration.dispatcher).to receive(:dispatch)
|
allow(Rails.configuration.dispatcher).to receive(:dispatch)
|
||||||
expect(conversation.contact_last_seen_at).to eq(nil)
|
expect(conversation.contact_last_seen_at).to be_nil
|
||||||
|
|
||||||
post '/api/v1/widget/conversations/update_last_seen',
|
post '/api/v1/widget/conversations/update_last_seen',
|
||||||
headers: { 'X-Auth-Token' => token },
|
headers: { 'X-Auth-Token' => token },
|
||||||
|
@ -133,7 +133,7 @@ RSpec.describe '/api/v1/widget/conversations/toggle_typing', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
|
|
||||||
expect(conversation.reload.contact_last_seen_at).not_to eq(nil)
|
expect(conversation.reload.contact_last_seen_at).not_to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -82,7 +82,7 @@ RSpec.describe '/api/v1/widget/messages', type: :request do
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
expect(json_response['content']).to eq(message_params[:content])
|
expect(json_response['content']).to eq(message_params[:content])
|
||||||
|
|
||||||
expect(conversation.messages.last.attachments.first.file.present?).to eq(true)
|
expect(conversation.messages.last.attachments.first.file.present?).to be(true)
|
||||||
expect(conversation.messages.last.attachments.first.file_type).to eq('image')
|
expect(conversation.messages.last.attachments.first.file_type).to eq('image')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ RSpec.describe '/api/v1/widget/messages', type: :request do
|
||||||
as: :json
|
as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.reload.resolved?).to eq(true)
|
expect(conversation.reload.resolved?).to be(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not create resolved activity messages when snoozed conversation is opened' do
|
it 'does not create resolved activity messages when snoozed conversation is opened' do
|
||||||
|
@ -118,7 +118,7 @@ RSpec.describe '/api/v1/widget/messages', type: :request do
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(conversation.reload.open?).to eq(true)
|
expect(conversation.reload.open?).to be(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,7 +15,7 @@ RSpec.describe 'Token Confirmation', type: :request do
|
||||||
let(:confirmation_token) { '12345' }
|
let(:confirmation_token) { '12345' }
|
||||||
|
|
||||||
it 'has status 200' do
|
it 'has status 200' do
|
||||||
expect(response.status).to eq 200
|
expect(response).to have_http_status :ok
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns "auth data"' do
|
it 'returns "auth data"' do
|
||||||
|
@ -28,7 +28,7 @@ RSpec.describe 'Token Confirmation', type: :request do
|
||||||
let(:confirmation_token) { '' }
|
let(:confirmation_token) { '' }
|
||||||
|
|
||||||
it 'has status 422' do
|
it 'has status 422' do
|
||||||
expect(response.status).to eq 422
|
expect(response).to have_http_status :unprocessable_entity
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns message "Invalid token"' do
|
it 'returns message "Invalid token"' do
|
||||||
|
@ -41,7 +41,7 @@ RSpec.describe 'Token Confirmation', type: :request do
|
||||||
let(:confirmation_token) { '12345' }
|
let(:confirmation_token) { '12345' }
|
||||||
|
|
||||||
it 'has status 422' do
|
it 'has status 422' do
|
||||||
expect(response.status).to eq 422
|
expect(response).to have_http_status :unprocessable_entity
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns message "Already confirmed"' do
|
it 'returns message "Already confirmed"' do
|
||||||
|
|
|
@ -6,7 +6,7 @@ RSpec.describe 'Installation::Onboarding API', type: :request do
|
||||||
describe 'GET /installation/onboarding' do
|
describe 'GET /installation/onboarding' do
|
||||||
context 'when CHATWOOT_INSTALLATION_ONBOARDING redis key is not set' do
|
context 'when CHATWOOT_INSTALLATION_ONBOARDING redis key is not set' do
|
||||||
it 'redirects back' do
|
it 'redirects back' do
|
||||||
expect(::Redis::Alfred.get(::Redis::Alfred::CHATWOOT_INSTALLATION_ONBOARDING)).to eq nil
|
expect(::Redis::Alfred.get(::Redis::Alfred::CHATWOOT_INSTALLATION_ONBOARDING)).to be_nil
|
||||||
get '/installation/onboarding'
|
get '/installation/onboarding'
|
||||||
expect(response).to have_http_status(:redirect)
|
expect(response).to have_http_status(:redirect)
|
||||||
end
|
end
|
||||||
|
@ -23,7 +23,7 @@ RSpec.describe 'Installation::Onboarding API', type: :request do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'POST /installation/onboarding' do
|
describe 'POST /installation/onboarding' do
|
||||||
let(:account_builder) { instance_double('account_builder') }
|
let(:account_builder) { double }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
allow(AccountBuilder).to receive(:new).and_return(account_builder)
|
allow(AccountBuilder).to receive(:new).and_return(account_builder)
|
||||||
|
@ -39,7 +39,7 @@ RSpec.describe 'Installation::Onboarding API', type: :request do
|
||||||
context 'when onboarding successfull' do
|
context 'when onboarding successfull' do
|
||||||
it 'deletes the redis key' do
|
it 'deletes the redis key' do
|
||||||
post '/installation/onboarding', params: { user: {} }
|
post '/installation/onboarding', params: { user: {} }
|
||||||
expect(::Redis::Alfred.get(::Redis::Alfred::CHATWOOT_INSTALLATION_ONBOARDING)).to eq nil
|
expect(::Redis::Alfred.get(::Redis::Alfred::CHATWOOT_INSTALLATION_ONBOARDING)).to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'will not call register instance when checkboxes are unchecked' do
|
it 'will not call register instance when checkboxes are unchecked' do
|
||||||
|
@ -57,7 +57,7 @@ RSpec.describe 'Installation::Onboarding API', type: :request do
|
||||||
it 'does not deletes the redis key' do
|
it 'does not deletes the redis key' do
|
||||||
allow(AccountBuilder).to receive(:new).and_raise('error')
|
allow(AccountBuilder).to receive(:new).and_raise('error')
|
||||||
post '/installation/onboarding', params: { user: {} }
|
post '/installation/onboarding', params: { user: {} }
|
||||||
expect(::Redis::Alfred.get(::Redis::Alfred::CHATWOOT_INSTALLATION_ONBOARDING)).not_to eq nil
|
expect(::Redis::Alfred.get(::Redis::Alfred::CHATWOOT_INSTALLATION_ONBOARDING)).not_to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -148,8 +148,8 @@ RSpec.describe 'Platform Users API', type: :request do
|
||||||
it 'updates the user attributes' do
|
it 'updates the user attributes' do
|
||||||
create(:platform_app_permissible, platform_app: platform_app, permissible: user)
|
create(:platform_app_permissible, platform_app: platform_app, permissible: user)
|
||||||
patch "/platform/api/v1/users/#{user.id}", params: {
|
patch "/platform/api/v1/users/#{user.id}", params: {
|
||||||
name: 'test123', email: 'newtestemail@test.com', custom_attributes: { test: 'test_update' }
|
name: 'test123', email: 'newtestemail@test.com', custom_attributes: { test: 'test_update' }
|
||||||
},
|
},
|
||||||
headers: { api_access_token: platform_app.access_token.token }, as: :json
|
headers: { api_access_token: platform_app.access_token.token }, as: :json
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
|
|
|
@ -12,8 +12,8 @@ RSpec.describe 'Public Inbox Contacts API', type: :request do
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
data = response.parsed_body
|
data = response.parsed_body
|
||||||
expect(data.keys).to include('email', 'id', 'name', 'phone_number', 'pubsub_token', 'source_id')
|
expect(data.keys).to include('email', 'id', 'name', 'phone_number', 'pubsub_token', 'source_id')
|
||||||
expect(data['source_id']).not_to eq nil
|
expect(data['source_id']).not_to be_nil
|
||||||
expect(data['pubsub_token']).not_to eq nil
|
expect(data['pubsub_token']).not_to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ RSpec.describe 'Public Inbox Contact Conversations API', type: :request do
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
data = JSON.parse(response.body)
|
data = JSON.parse(response.body)
|
||||||
expect(data['id']).not_to eq nil
|
expect(data['id']).not_to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -49,7 +49,7 @@ RSpec.describe 'Public Inbox Contact Conversation Messages API', type: :request
|
||||||
data = JSON.parse(response.body)
|
data = JSON.parse(response.body)
|
||||||
expect(data['content']).to eq('hello')
|
expect(data['content']).to eq('hello')
|
||||||
|
|
||||||
expect(conversation.messages.last.attachments.first.file.present?).to eq(true)
|
expect(conversation.messages.last.attachments.first.file.present?).to be(true)
|
||||||
expect(conversation.messages.last.attachments.first.file_type).to eq('image')
|
expect(conversation.messages.last.attachments.first.file_type).to eq('image')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -32,7 +32,7 @@ RSpec.describe 'Public Articles API', type: :request do
|
||||||
category: category,
|
category: category,
|
||||||
author_id: agent.id,
|
author_id: agent.id,
|
||||||
content: 'this is some test and funny content')
|
content: 'this is some test and funny content')
|
||||||
expect(article2.id).not_to be nil
|
expect(article2.id).not_to be_nil
|
||||||
|
|
||||||
get "/public/api/v1/portals/#{portal.slug}/articles",
|
get "/public/api/v1/portals/#{portal.slug}/articles",
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
|
|
|
@ -10,7 +10,7 @@ describe '/survey/response', type: :request do
|
||||||
|
|
||||||
it 'returns 404 when called with invalid conversation uuid' do
|
it 'returns 404 when called with invalid conversation uuid' do
|
||||||
get survey_response_url(id: '')
|
get survey_response_url(id: '')
|
||||||
expect(response.status).to eq(404)
|
expect(response).to have_http_status(:not_found)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -36,7 +36,7 @@ RSpec.describe 'Super Admin Application Config API', type: :request do
|
||||||
sign_in(super_admin, scope: :super_admin)
|
sign_in(super_admin, scope: :super_admin)
|
||||||
post '/super_admin/app_config', params: { app_config: { TESTKEY: 'TESTVALUE' } }
|
post '/super_admin/app_config', params: { app_config: { TESTKEY: 'TESTVALUE' } }
|
||||||
|
|
||||||
expect(response.status).to eq(302)
|
expect(response).to have_http_status(:found)
|
||||||
expect(response).to redirect_to(super_admin_app_config_path)
|
expect(response).to redirect_to(super_admin_app_config_path)
|
||||||
|
|
||||||
config = GlobalConfig.get('TESTKEY')
|
config = GlobalConfig.get('TESTKEY')
|
||||||
|
|
|
@ -3,9 +3,7 @@ require 'rails_helper'
|
||||||
RSpec.describe 'Twitter::CallbacksController', type: :request do
|
RSpec.describe 'Twitter::CallbacksController', type: :request do
|
||||||
let(:twitter_client) { instance_double(::Twitty::Facade) }
|
let(:twitter_client) { instance_double(::Twitty::Facade) }
|
||||||
let(:twitter_response) { instance_double(::Twitty::Response, status: '200', body: { message: 'Valid' }) }
|
let(:twitter_response) { instance_double(::Twitty::Response, status: '200', body: { message: 'Valid' }) }
|
||||||
let(:raw_response) do
|
let(:raw_response) { double }
|
||||||
object_double('raw_response', body: 'oauth_token=1&oauth_token_secret=1&user_id=100&screen_name=chatwoot')
|
|
||||||
end
|
|
||||||
let(:account) { create(:account) }
|
let(:account) { create(:account) }
|
||||||
let(:webhook_service) { double }
|
let(:webhook_service) { double }
|
||||||
|
|
||||||
|
@ -15,6 +13,7 @@ RSpec.describe 'Twitter::CallbacksController', type: :request do
|
||||||
allow(::Redis::Alfred).to receive(:delete).and_return('OK')
|
allow(::Redis::Alfred).to receive(:delete).and_return('OK')
|
||||||
allow(twitter_client).to receive(:access_token).and_return(twitter_response)
|
allow(twitter_client).to receive(:access_token).and_return(twitter_response)
|
||||||
allow(twitter_response).to receive(:raw_response).and_return(raw_response)
|
allow(twitter_response).to receive(:raw_response).and_return(raw_response)
|
||||||
|
allow(raw_response).to receive(:body).and_return('oauth_token=1&oauth_token_secret=1&user_id=100&screen_name=chatwoot')
|
||||||
allow(::Twitter::WebhookSubscribeService).to receive(:new).and_return(webhook_service)
|
allow(::Twitter::WebhookSubscribeService).to receive(:new).and_return(webhook_service)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ describe '/widget', type: :request do
|
||||||
|
|
||||||
it 'returns 404 when called with out website_token' do
|
it 'returns 404 when called with out website_token' do
|
||||||
get widget_url
|
get widget_url
|
||||||
expect(response.status).to eq(404)
|
expect(response).to have_http_status(:not_found)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,11 +4,11 @@ describe UrlHelper, type: :helper do
|
||||||
describe '#url_valid' do
|
describe '#url_valid' do
|
||||||
context 'when url valid called' do
|
context 'when url valid called' do
|
||||||
it 'return if valid url passed' do
|
it 'return if valid url passed' do
|
||||||
expect(helper.url_valid?('https://app.chatwoot.com/')).to eq true
|
expect(helper.url_valid?('https://app.chatwoot.com/')).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'return false if invalid url passed' do
|
it 'return false if invalid url passed' do
|
||||||
expect(helper.url_valid?('javascript:alert(document.cookie)')).to eq false
|
expect(helper.url_valid?('javascript:alert(document.cookie)')).to be false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -51,7 +51,7 @@ RSpec.describe BulkActionsJob, type: :job do
|
||||||
ids: Conversation.first(3).pluck(:display_id)
|
ids: Conversation.first(3).pluck(:display_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(Conversation.first.assignee_id).to eq(nil)
|
expect(Conversation.first.assignee_id).to be_nil
|
||||||
|
|
||||||
described_class.perform_now(account: account, params: params, user: agent)
|
described_class.perform_now(account: account, params: params, user: agent)
|
||||||
|
|
||||||
|
|
|
@ -7,13 +7,6 @@ describe Webhooks::InstagramEventsJob do
|
||||||
before do
|
before do
|
||||||
stub_request(:post, /graph.facebook.com/)
|
stub_request(:post, /graph.facebook.com/)
|
||||||
stub_request(:get, 'https://www.example.com/test.jpeg')
|
stub_request(:get, 'https://www.example.com/test.jpeg')
|
||||||
.with(
|
|
||||||
headers: {
|
|
||||||
'Accept' => '*/*',
|
|
||||||
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
|
||||||
'User-Agent' => 'Down/5.3.0'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
.to_return(status: 200, body: '', headers: {})
|
.to_return(status: 200, body: '', headers: {})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -78,7 +71,7 @@ describe Webhooks::InstagramEventsJob do
|
||||||
instagram_webhook.perform_now(unsend_event[:entry])
|
instagram_webhook.perform_now(unsend_event[:entry])
|
||||||
|
|
||||||
expect(instagram_inbox.messages.last.content).to eq 'This message was deleted'
|
expect(instagram_inbox.messages.last.content).to eq 'This message was deleted'
|
||||||
expect(instagram_inbox.messages.last.reload.deleted).to eq true
|
expect(instagram_inbox.messages.last.reload.deleted).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'creates incoming message with attachments in the instagram inbox' do
|
it 'creates incoming message with attachments in the instagram inbox' do
|
||||||
|
|
|
@ -2,7 +2,7 @@ require 'rails_helper'
|
||||||
|
|
||||||
describe ChatwootCaptcha do
|
describe ChatwootCaptcha do
|
||||||
it 'returns true if HCAPTCHA SERVER KEY is absent' do
|
it 'returns true if HCAPTCHA SERVER KEY is absent' do
|
||||||
expect(described_class.new('random_key').valid?).to eq(true)
|
expect(described_class.new('random_key').valid?).to be(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when HCAPTCHA SERVER KEY is present' do
|
context 'when HCAPTCHA SERVER KEY is present' do
|
||||||
|
@ -11,7 +11,7 @@ describe ChatwootCaptcha do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns false if client response is blank' do
|
it 'returns false if client response is blank' do
|
||||||
expect(described_class.new('').valid?).to eq false
|
expect(described_class.new('').valid?).to be false
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns true if client response is valid' do
|
it 'returns true if client response is valid' do
|
||||||
|
@ -19,7 +19,7 @@ describe ChatwootCaptcha do
|
||||||
allow(HTTParty).to receive(:post).and_return(captcha_request)
|
allow(HTTParty).to receive(:post).and_return(captcha_request)
|
||||||
allow(captcha_request).to receive(:success?).and_return(true)
|
allow(captcha_request).to receive(:success?).and_return(true)
|
||||||
allow(captcha_request).to receive(:parsed_response).and_return({ 'success' => true })
|
allow(captcha_request).to receive(:parsed_response).and_return({ 'success' => true })
|
||||||
expect(described_class.new('valid_response').valid?).to eq true
|
expect(described_class.new('valid_response').valid?).to be true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@ require 'rails_helper'
|
||||||
describe ChatwootHub do
|
describe ChatwootHub do
|
||||||
it 'generates installation identifier' do
|
it 'generates installation identifier' do
|
||||||
installation_identifier = described_class.installation_identifier
|
installation_identifier = described_class.installation_identifier
|
||||||
expect(installation_identifier).not_to eq nil
|
expect(installation_identifier).not_to be_nil
|
||||||
expect(described_class.installation_identifier).to eq installation_identifier
|
expect(described_class.installation_identifier).to eq installation_identifier
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ describe ChatwootHub do
|
||||||
|
|
||||||
it 'returns nil when chatwoot hub is down' do
|
it 'returns nil when chatwoot hub is down' do
|
||||||
allow(RestClient).to receive(:post).and_raise(ExceptionList::REST_CLIENT_EXCEPTIONS.sample)
|
allow(RestClient).to receive(:post).and_raise(ExceptionList::REST_CLIENT_EXCEPTIONS.sample)
|
||||||
expect(described_class.latest_version).to eq nil
|
expect(described_class.latest_version).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ describe GlobalConfigService do
|
||||||
|
|
||||||
it 'get value from env variable even if present on DB' do
|
it 'get value from env variable even if present on DB' do
|
||||||
with_modified_env ENABLE_ACCOUNT_SIGNUP: 'false' do
|
with_modified_env ENABLE_ACCOUNT_SIGNUP: 'false' do
|
||||||
expect(InstallationConfig.find_by(name: 'ENABLE_ACCOUNT_SIGNUP')&.value).to eq nil
|
expect(InstallationConfig.find_by(name: 'ENABLE_ACCOUNT_SIGNUP')&.value).to be_nil
|
||||||
value = described_class.load('ENABLE_ACCOUNT_SIGNUP', 'true')
|
value = described_class.load('ENABLE_ACCOUNT_SIGNUP', 'true')
|
||||||
expect(value).to eq 'false'
|
expect(value).to eq 'false'
|
||||||
end
|
end
|
||||||
|
|
|
@ -61,7 +61,7 @@ describe Integrations::Csml::ProcessorService do
|
||||||
let(:conversation) { create(:conversation, account: account, status: :open) }
|
let(:conversation) { create(:conversation, account: account, status: :open) }
|
||||||
|
|
||||||
it 'returns nil' do
|
it 'returns nil' do
|
||||||
expect(processor.perform).to be(nil)
|
expect(processor.perform).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ describe Integrations::Csml::ProcessorService do
|
||||||
let(:message) { create(:message, account: account, conversation: conversation, private: true) }
|
let(:message) { create(:message, account: account, conversation: conversation, private: true) }
|
||||||
|
|
||||||
it 'returns nil' do
|
it 'returns nil' do
|
||||||
expect(processor.perform).to be(nil)
|
expect(processor.perform).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ describe Integrations::Csml::ProcessorService do
|
||||||
let(:message) { create(:message, account: account, conversation: conversation, message_type: :template) }
|
let(:message) { create(:message, account: account, conversation: conversation, message_type: :template) }
|
||||||
|
|
||||||
it 'returns nil' do
|
it 'returns nil' do
|
||||||
expect(processor.perform).to be(nil)
|
expect(processor.perform).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ describe Integrations::Csml::ProcessorService do
|
||||||
let(:event_name) { 'message.updated' }
|
let(:event_name) { 'message.updated' }
|
||||||
|
|
||||||
it 'returns nil' do
|
it 'returns nil' do
|
||||||
expect(processor.perform).to be(nil)
|
expect(processor.perform).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -93,7 +93,7 @@ describe Integrations::Dialogflow::ProcessorService do
|
||||||
let(:conversation) { create(:conversation, account: account, status: :open) }
|
let(:conversation) { create(:conversation, account: account, status: :open) }
|
||||||
|
|
||||||
it 'returns nil' do
|
it 'returns nil' do
|
||||||
expect(processor.perform).to be(nil)
|
expect(processor.perform).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ describe Integrations::Dialogflow::ProcessorService do
|
||||||
let(:message) { create(:message, account: account, conversation: conversation, private: true) }
|
let(:message) { create(:message, account: account, conversation: conversation, private: true) }
|
||||||
|
|
||||||
it 'returns nil' do
|
it 'returns nil' do
|
||||||
expect(processor.perform).to be(nil)
|
expect(processor.perform).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ describe Integrations::Slack::IncomingMessageBuilder do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'creates message' do
|
it 'creates message' do
|
||||||
expect(hook).not_to eq nil
|
expect(hook).not_to be_nil
|
||||||
messages_count = conversation.messages.count
|
messages_count = conversation.messages.count
|
||||||
builder = described_class.new(message_params)
|
builder = described_class.new(message_params)
|
||||||
allow(builder).to receive(:sender).and_return(nil)
|
allow(builder).to receive(:sender).and_return(nil)
|
||||||
|
@ -71,7 +71,7 @@ describe Integrations::Slack::IncomingMessageBuilder do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'saves attachment if params files present' do
|
it 'saves attachment if params files present' do
|
||||||
expect(hook).not_to eq nil
|
expect(hook).not_to be_nil
|
||||||
messages_count = conversation.messages.count
|
messages_count = conversation.messages.count
|
||||||
builder = described_class.new(message_with_attachments)
|
builder = described_class.new(message_with_attachments)
|
||||||
allow(builder).to receive(:sender).and_return(nil)
|
allow(builder).to receive(:sender).and_return(nil)
|
||||||
|
@ -82,7 +82,7 @@ describe Integrations::Slack::IncomingMessageBuilder do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'ignore message if it is postback of CW attachment message' do
|
it 'ignore message if it is postback of CW attachment message' do
|
||||||
expect(hook).not_to eq nil
|
expect(hook).not_to be_nil
|
||||||
messages_count = conversation.messages.count
|
messages_count = conversation.messages.count
|
||||||
message_with_attachments[:event][:text] = 'Attached File!'
|
message_with_attachments[:event][:text] = 'Attached File!'
|
||||||
builder = described_class.new(message_with_attachments)
|
builder = described_class.new(message_with_attachments)
|
||||||
|
|
|
@ -134,7 +134,7 @@ describe NotificationListener do
|
||||||
|
|
||||||
event = Events::Base.new(event_name, Time.zone.now, message: message)
|
event = Events::Base.new(event_name, Time.zone.now, message: message)
|
||||||
# want to validate message_created doesnt throw an error
|
# want to validate message_created doesnt throw an error
|
||||||
expect(listener.message_created(event)).to eq nil
|
expect(listener.message_created(event)).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -136,7 +136,7 @@ RSpec.describe ReplyMailbox, type: :mailbox do
|
||||||
described_subject
|
described_subject
|
||||||
current_message = conversation.messages.last
|
current_message = conversation.messages.last
|
||||||
expect(current_message.content).to eq(
|
expect(current_message.content).to eq(
|
||||||
<<-BODY.strip_heredoc.chomp
|
<<~BODY.chomp
|
||||||
Yes, I am providing you step how to reproduce this issue
|
Yes, I am providing you step how to reproduce this issue
|
||||||
|
|
||||||
On Thu, Aug 19, 2021 at 2:07 PM Tejaswini from Email sender test < tejaswini@chatwoot.com> wrote:
|
On Thu, Aug 19, 2021 at 2:07 PM Tejaswini from Email sender test < tejaswini@chatwoot.com> wrote:
|
||||||
|
@ -157,7 +157,7 @@ RSpec.describe ReplyMailbox, type: :mailbox do
|
||||||
described_subject
|
described_subject
|
||||||
current_message = conversation.messages.last
|
current_message = conversation.messages.last
|
||||||
expect(current_message.reload.content_attributes[:email][:text_content][:reply]).to eq(
|
expect(current_message.reload.content_attributes[:email][:text_content][:reply]).to eq(
|
||||||
<<-BODY.strip_heredoc.chomp
|
<<~BODY.chomp
|
||||||
Yes, I am providing you step how to reproduce this issue
|
Yes, I am providing you step how to reproduce this issue
|
||||||
|
|
||||||
On Thu, Aug 19, 2021 at 2:07 PM Tejaswini from Email sender test < tejaswini@chatwoot.com> wrote:
|
On Thu, Aug 19, 2021 at 2:07 PM Tejaswini from Email sender test < tejaswini@chatwoot.com> wrote:
|
||||||
|
|
|
@ -12,7 +12,7 @@ RSpec.describe SupportMailbox, type: :mailbox do
|
||||||
|
|
||||||
it 'shouldnt create a conversation in the channel' do
|
it 'shouldnt create a conversation in the channel' do
|
||||||
described_subject
|
described_subject
|
||||||
expect(conversation.present?).to eq(false)
|
expect(conversation.present?).to be(false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ RSpec.describe SupportMailbox, type: :mailbox do
|
||||||
expect(conversation.inbox.id).to eq(channel_email.inbox.id)
|
expect(conversation.inbox.id).to eq(channel_email.inbox.id)
|
||||||
|
|
||||||
expect(conversation.messages.last.content_attributes['email']['html_content']['reply']).to include(
|
expect(conversation.messages.last.content_attributes['email']['html_content']['reply']).to include(
|
||||||
<<-BODY.strip_heredoc.chomp
|
<<~BODY.chomp
|
||||||
Hi,
|
Hi,
|
||||||
We are providing you platform from here you can sell paid posts on your website.
|
We are providing you platform from here you can sell paid posts on your website.
|
||||||
|
|
||||||
|
@ -231,8 +231,8 @@ RSpec.describe SupportMailbox, type: :mailbox do
|
||||||
expect(conversation.inbox.id).to eq(channel_email.inbox.id)
|
expect(conversation.inbox.id).to eq(channel_email.inbox.id)
|
||||||
|
|
||||||
expect(conversation.messages.last.content).to eq(
|
expect(conversation.messages.last.content).to eq(
|
||||||
<<-BODY.strip_heredoc.chomp
|
<<~BODY.chomp
|
||||||
This is html only mail
|
This is html only mail
|
||||||
BODY
|
BODY
|
||||||
)
|
)
|
||||||
expect(conversation.messages.last.content_attributes['email']['subject']).to eq('test html only mail')
|
expect(conversation.messages.last.content_attributes['email']['subject']).to eq('test html only mail')
|
||||||
|
@ -243,7 +243,7 @@ RSpec.describe SupportMailbox, type: :mailbox do
|
||||||
|
|
||||||
expect(conversation.inbox.id).to eq(channel_email.inbox.id)
|
expect(conversation.inbox.id).to eq(channel_email.inbox.id)
|
||||||
|
|
||||||
expect(conversation.messages.last.content).to eq(nil)
|
expect(conversation.messages.last.content).to be_nil
|
||||||
expect(conversation.messages.last.attachments.count).to eq(1)
|
expect(conversation.messages.last.attachments.count).to eq(1)
|
||||||
expect(conversation.messages.last.content_attributes['email']['subject']).to eq('only attachments')
|
expect(conversation.messages.last.content_attributes['email']['subject']).to eq('only attachments')
|
||||||
end
|
end
|
||||||
|
|
|
@ -70,7 +70,7 @@ RSpec.describe AgentNotifications::ConversationNotificationsMailer, type: :maile
|
||||||
|
|
||||||
it 'will not send email if agent is online' do
|
it 'will not send email if agent is online' do
|
||||||
::OnlineStatusTracker.update_presence(conversation.account.id, 'User', agent.id)
|
::OnlineStatusTracker.update_presence(conversation.account.id, 'User', agent.id)
|
||||||
expect(mail).to eq nil
|
expect(mail).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -71,7 +71,7 @@ RSpec.describe ConversationReplyMailer, type: :mailer do
|
||||||
it 'will not send email if conversation is already viewed by contact' do
|
it 'will not send email if conversation is already viewed by contact' do
|
||||||
create(:message, message_type: 'outgoing', account: account, conversation: conversation)
|
create(:message, message_type: 'outgoing', account: account, conversation: conversation)
|
||||||
conversation.update(contact_last_seen_at: Time.zone.now)
|
conversation.update(contact_last_seen_at: Time.zone.now)
|
||||||
expect(mail).to eq nil
|
expect(mail).to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'will send email to cc and bcc email addresses' do
|
it 'will send email to cc and bcc email addresses' do
|
||||||
|
@ -132,7 +132,7 @@ RSpec.describe ConversationReplyMailer, type: :mailer do
|
||||||
it 'will not send email if conversation is already viewed by contact' do
|
it 'will not send email if conversation is already viewed by contact' do
|
||||||
create(:message, message_type: 'outgoing', account: account, conversation: conversation)
|
create(:message, message_type: 'outgoing', account: account, conversation: conversation)
|
||||||
conversation.update(contact_last_seen_at: Time.zone.now)
|
conversation.update(contact_last_seen_at: Time.zone.now)
|
||||||
expect(mail).to eq nil
|
expect(mail).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,10 @@ RSpec.describe User do
|
||||||
|
|
||||||
describe 'notification_settings' do
|
describe 'notification_settings' do
|
||||||
it 'gets created with the right default settings' do
|
it 'gets created with the right default settings' do
|
||||||
expect(account_user.user.notification_settings).not_to eq(nil)
|
expect(account_user.user.notification_settings).not_to be_nil
|
||||||
|
|
||||||
expect(account_user.user.notification_settings.first.email_conversation_creation?).to eq(false)
|
expect(account_user.user.notification_settings.first.email_conversation_creation?).to be(false)
|
||||||
expect(account_user.user.notification_settings.first.email_conversation_assignment?).to eq(true)
|
expect(account_user.user.notification_settings.first.email_conversation_assignment?).to be(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ RSpec.describe Attachment, type: :model do
|
||||||
message = create(:message)
|
message = create(:message)
|
||||||
attachment = message.attachments.new(account_id: message.account_id, file_type: :image)
|
attachment = message.attachments.new(account_id: message.account_id, file_type: :image)
|
||||||
attachment.file.attach(io: File.open(Rails.root.join('spec/assets/avatar.png')), filename: 'avatar.png', content_type: 'image/png')
|
attachment.file.attach(io: File.open(Rails.root.join('spec/assets/avatar.png')), filename: 'avatar.png', content_type: 'image/png')
|
||||||
expect(attachment.download_url).not_to eq nil
|
expect(attachment.download_url).not_to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -50,7 +50,7 @@ RSpec.describe AutomationRule, type: :model do
|
||||||
|
|
||||||
it 'returns valid record' do
|
it 'returns valid record' do
|
||||||
rule = FactoryBot.build(:automation_rule, params)
|
rule = FactoryBot.build(:automation_rule, params)
|
||||||
expect(rule.valid?).to eq true
|
expect(rule.valid?).to be true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -34,7 +34,7 @@ RSpec.describe Campaign, type: :model do
|
||||||
let(:campaign) { build(:campaign, inbox: facebook_inbox) }
|
let(:campaign) { build(:campaign, inbox: facebook_inbox) }
|
||||||
|
|
||||||
it 'would not save the campaigns' do
|
it 'would not save the campaigns' do
|
||||||
expect(campaign.save).to eq false
|
expect(campaign.save).to be false
|
||||||
expect(campaign.errors.full_messages.first).to eq 'Inbox Unsupported Inbox type'
|
expect(campaign.errors.full_messages.first).to eq 'Inbox Unsupported Inbox type'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -46,18 +46,18 @@ RSpec.describe Campaign, type: :model do
|
||||||
|
|
||||||
it 'would prevent further updates' do
|
it 'would prevent further updates' do
|
||||||
campaign.title = 'new name'
|
campaign.title = 'new name'
|
||||||
expect(campaign.save).to eq false
|
expect(campaign.save).to be false
|
||||||
expect(campaign.errors.full_messages.first).to eq 'Status The campaign is already completed'
|
expect(campaign.errors.full_messages.first).to eq 'Status The campaign is already completed'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'can be deleted' do
|
it 'can be deleted' do
|
||||||
campaign.destroy!
|
campaign.destroy!
|
||||||
expect(described_class.exists?(campaign.id)).to eq false
|
expect(described_class.exists?(campaign.id)).to be false
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'cant be triggered' do
|
it 'cant be triggered' do
|
||||||
expect(Twilio::OneoffSmsCampaignService).not_to receive(:new).with(campaign: campaign)
|
expect(Twilio::OneoffSmsCampaignService).not_to receive(:new).with(campaign: campaign)
|
||||||
expect(campaign.trigger!).to eq nil
|
expect(campaign.trigger!).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ RSpec.describe Campaign, type: :model do
|
||||||
campaign.campaign_type = 'ongoing'
|
campaign.campaign_type = 'ongoing'
|
||||||
campaign.save!
|
campaign.save!
|
||||||
expect(campaign.reload.campaign_type).to eq 'one_off'
|
expect(campaign.reload.campaign_type).to eq 'one_off'
|
||||||
expect(campaign.scheduled_at.present?).to eq true
|
expect(campaign.scheduled_at.present?).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'calls twilio service on trigger!' do
|
it 'calls twilio service on trigger!' do
|
||||||
|
@ -92,7 +92,7 @@ RSpec.describe Campaign, type: :model do
|
||||||
campaign.campaign_type = 'ongoing'
|
campaign.campaign_type = 'ongoing'
|
||||||
campaign.save!
|
campaign.save!
|
||||||
expect(campaign.reload.campaign_type).to eq 'one_off'
|
expect(campaign.reload.campaign_type).to eq 'one_off'
|
||||||
expect(campaign.scheduled_at.present?).to eq true
|
expect(campaign.scheduled_at.present?).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'calls sms service on trigger!' do
|
it 'calls sms service on trigger!' do
|
||||||
|
|
|
@ -8,7 +8,7 @@ RSpec.describe Channel::TwilioSms do
|
||||||
let!(:whatsapp_channel) { create(:channel_twilio_sms, medium: :whatsapp) }
|
let!(:whatsapp_channel) { create(:channel_twilio_sms, medium: :whatsapp) }
|
||||||
|
|
||||||
it 'returns true' do
|
it 'returns true' do
|
||||||
expect(whatsapp_channel.messaging_window_enabled?).to eq true
|
expect(whatsapp_channel.messaging_window_enabled?).to be true
|
||||||
expect(whatsapp_channel.name).to eq 'Whatsapp'
|
expect(whatsapp_channel.name).to eq 'Whatsapp'
|
||||||
expect(whatsapp_channel.medium).to eq 'whatsapp'
|
expect(whatsapp_channel.medium).to eq 'whatsapp'
|
||||||
end
|
end
|
||||||
|
@ -18,7 +18,7 @@ RSpec.describe Channel::TwilioSms do
|
||||||
let!(:sms_channel) { create(:channel_twilio_sms, medium: :sms) }
|
let!(:sms_channel) { create(:channel_twilio_sms, medium: :sms) }
|
||||||
|
|
||||||
it 'returns false' do
|
it 'returns false' do
|
||||||
expect(sms_channel.messaging_window_enabled?).to eq false
|
expect(sms_channel.messaging_window_enabled?).to be false
|
||||||
expect(sms_channel.name).to eq 'Twilio SMS'
|
expect(sms_channel.name).to eq 'Twilio SMS'
|
||||||
expect(sms_channel.medium).to eq 'sms'
|
expect(sms_channel.medium).to eq 'sms'
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,7 +8,7 @@ RSpec.describe Channel::Whatsapp do
|
||||||
|
|
||||||
it 'validates false when provider config is wrong' do
|
it 'validates false when provider config is wrong' do
|
||||||
stub_request(:get, 'https://graph.facebook.com/v14.0//message_templates?access_token=test_key').to_return(status: 401)
|
stub_request(:get, 'https://graph.facebook.com/v14.0//message_templates?access_token=test_key').to_return(status: 401)
|
||||||
expect(channel.save).to eq(false)
|
expect(channel.save).to be(false)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'validates true when provider config is right' do
|
it 'validates true when provider config is right' do
|
||||||
|
@ -17,7 +17,7 @@ RSpec.describe Channel::Whatsapp do
|
||||||
body: { data: [{
|
body: { data: [{
|
||||||
id: '123456789', name: 'test_template'
|
id: '123456789', name: 'test_template'
|
||||||
}] }.to_json)
|
}] }.to_json)
|
||||||
expect(channel.save).to eq(true)
|
expect(channel.save).to be(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,6 +4,6 @@ shared_examples_for 'access_tokenable' do
|
||||||
let(:obj) { create(described_class.to_s.underscore) }
|
let(:obj) { create(described_class.to_s.underscore) }
|
||||||
|
|
||||||
it 'creates access token on create' do
|
it 'creates access token on create' do
|
||||||
expect(obj.access_token).not_to eq(nil)
|
expect(obj.access_token).not_to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -21,8 +21,8 @@ shared_examples_for 'assignment_handler' do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'creates team assigned and unassigned message activity' do
|
it 'creates team assigned and unassigned message activity' do
|
||||||
expect(conversation.update(team: team)).to eq true
|
expect(conversation.update(team: team)).to be true
|
||||||
expect(conversation.update(team: nil)).to eq true
|
expect(conversation.update(team: nil)).to be true
|
||||||
expect(Conversations::ActivityMessageJob).to(have_been_enqueued.at_least(:once)
|
expect(Conversations::ActivityMessageJob).to(have_been_enqueued.at_least(:once)
|
||||||
.with(conversation, { account_id: conversation.account_id, inbox_id: conversation.inbox_id, message_type: :activity,
|
.with(conversation, { account_id: conversation.account_id, inbox_id: conversation.inbox_id, message_type: :activity,
|
||||||
content: "Assigned to #{team.name} by #{agent.name}" }))
|
content: "Assigned to #{team.name} by #{agent.name}" }))
|
||||||
|
@ -32,11 +32,11 @@ shared_examples_for 'assignment_handler' do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'changes assignee to nil if they doesnt belong to the team and allow_auto_assign is false' do
|
it 'changes assignee to nil if they doesnt belong to the team and allow_auto_assign is false' do
|
||||||
expect(team.allow_auto_assign).to eq false
|
expect(team.allow_auto_assign).to be false
|
||||||
|
|
||||||
conversation.update(team: team)
|
conversation.update(team: team)
|
||||||
|
|
||||||
expect(conversation.reload.assignee).to eq nil
|
expect(conversation.reload.assignee).to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'changes assignee to a team member if allow_auto_assign is enabled' do
|
it 'changes assignee to a team member if allow_auto_assign is enabled' do
|
||||||
|
@ -74,7 +74,7 @@ shared_examples_for 'assignment_handler' do
|
||||||
let(:assignment_mailer) { instance_double(AgentNotifications::ConversationNotificationsMailer, deliver: true) }
|
let(:assignment_mailer) { instance_double(AgentNotifications::ConversationNotificationsMailer, deliver: true) }
|
||||||
|
|
||||||
it 'assigns the agent to conversation' do
|
it 'assigns the agent to conversation' do
|
||||||
expect(update_assignee).to eq(true)
|
expect(update_assignee).to be(true)
|
||||||
expect(conversation.reload.assignee).to eq(agent)
|
expect(conversation.reload.assignee).to eq(agent)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ shared_examples_for 'assignment_handler' do
|
||||||
# TODO: FIX me
|
# TODO: FIX me
|
||||||
# expect(EventDispatcherJob).to(have_been_enqueued.at_least(:once).with('assignee.changed', anything, anything, anything, anything))
|
# expect(EventDispatcherJob).to(have_been_enqueued.at_least(:once).with('assignee.changed', anything, anything, anything, anything))
|
||||||
expect(EventDispatcherJob).to(have_been_enqueued.at_least(:once))
|
expect(EventDispatcherJob).to(have_been_enqueued.at_least(:once))
|
||||||
expect(update_assignee).to eq(true)
|
expect(update_assignee).to be(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when agent is current user' do
|
context 'when agent is current user' do
|
||||||
|
@ -91,7 +91,7 @@ shared_examples_for 'assignment_handler' do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'creates self-assigned message activity' do
|
it 'creates self-assigned message activity' do
|
||||||
expect(update_assignee).to eq(true)
|
expect(update_assignee).to be(true)
|
||||||
expect(Conversations::ActivityMessageJob).to(have_been_enqueued.at_least(:once)
|
expect(Conversations::ActivityMessageJob).to(have_been_enqueued.at_least(:once)
|
||||||
.with(conversation, { account_id: conversation.account_id, inbox_id: conversation.inbox_id,
|
.with(conversation, { account_id: conversation.account_id, inbox_id: conversation.inbox_id,
|
||||||
message_type: :activity, content: "#{agent.name} self-assigned this conversation" }))
|
message_type: :activity, content: "#{agent.name} self-assigned this conversation" }))
|
||||||
|
|
|
@ -14,21 +14,21 @@ shared_examples_for 'reauthorizable' do
|
||||||
|
|
||||||
it 'prompts reauthorization when error threshold is passed' do
|
it 'prompts reauthorization when error threshold is passed' do
|
||||||
obj = FactoryBot.create(model.to_s.underscore.tr('/', '_').to_sym)
|
obj = FactoryBot.create(model.to_s.underscore.tr('/', '_').to_sym)
|
||||||
expect(obj.reauthorization_required?).to eq false
|
expect(obj.reauthorization_required?).to be false
|
||||||
|
|
||||||
obj.class::AUTHORIZATION_ERROR_THRESHOLD.times do
|
obj.class::AUTHORIZATION_ERROR_THRESHOLD.times do
|
||||||
obj.authorization_error!
|
obj.authorization_error!
|
||||||
end
|
end
|
||||||
|
|
||||||
expect(obj.reauthorization_required?).to eq true
|
expect(obj.reauthorization_required?).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'prompt_reauthorization!' do
|
it 'prompt_reauthorization!' do
|
||||||
obj = FactoryBot.create(model.to_s.underscore.tr('/', '_').to_sym)
|
obj = FactoryBot.create(model.to_s.underscore.tr('/', '_').to_sym)
|
||||||
expect(obj.reauthorization_required?).to eq false
|
expect(obj.reauthorization_required?).to be false
|
||||||
|
|
||||||
obj.prompt_reauthorization!
|
obj.prompt_reauthorization!
|
||||||
expect(obj.reauthorization_required?).to eq true
|
expect(obj.reauthorization_required?).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'reauthorized!' do
|
it 'reauthorized!' do
|
||||||
|
@ -36,13 +36,13 @@ shared_examples_for 'reauthorizable' do
|
||||||
# setting up the object with the errors to validate its cleared on action
|
# setting up the object with the errors to validate its cleared on action
|
||||||
obj.authorization_error!
|
obj.authorization_error!
|
||||||
obj.prompt_reauthorization!
|
obj.prompt_reauthorization!
|
||||||
expect(obj.reauthorization_required?).to eq true
|
expect(obj.reauthorization_required?).to be true
|
||||||
expect(obj.authorization_error_count).not_to eq 0
|
expect(obj.authorization_error_count).not_to eq 0
|
||||||
|
|
||||||
obj.reauthorized!
|
obj.reauthorized!
|
||||||
|
|
||||||
# authorization errors are reset
|
# authorization errors are reset
|
||||||
expect(obj.authorization_error_count).to eq 0
|
expect(obj.authorization_error_count).to eq 0
|
||||||
expect(obj.reauthorization_required?).to eq false
|
expect(obj.reauthorization_required?).to be false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -31,7 +31,7 @@ shared_examples_for 'round_robin_handler' do
|
||||||
inbox.update(enable_auto_assignment: false)
|
inbox.update(enable_auto_assignment: false)
|
||||||
|
|
||||||
# run_round_robin
|
# run_round_robin
|
||||||
expect(conversation.reload.assignee).to eq(nil)
|
expect(conversation.reload.assignee).to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'will not auto assign agent if its a bot conversation' do
|
it 'will not auto assign agent if its a bot conversation' do
|
||||||
|
@ -45,7 +45,7 @@ shared_examples_for 'round_robin_handler' do
|
||||||
)
|
)
|
||||||
|
|
||||||
# run_round_robin
|
# run_round_robin
|
||||||
expect(conversation.reload.assignee).to eq(nil)
|
expect(conversation.reload.assignee).to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'gets triggered on update only when status changes to open' do
|
it 'gets triggered on update only when status changes to open' do
|
||||||
|
|
|
@ -8,7 +8,7 @@ RSpec.describe ContactInbox do
|
||||||
|
|
||||||
it 'gets created on object create' do
|
it 'gets created on object create' do
|
||||||
obj = contact_inbox
|
obj = contact_inbox
|
||||||
expect(obj.pubsub_token).not_to eq(nil)
|
expect(obj.pubsub_token).not_to be_nil
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not get updated on object update' do
|
it 'does not get updated on object update' do
|
||||||
|
@ -29,7 +29,7 @@ RSpec.describe ContactInbox do
|
||||||
|
|
||||||
# ensure the column is nil in database
|
# ensure the column is nil in database
|
||||||
results = ActiveRecord::Base.connection.execute('Select * from contact_inboxes;')
|
results = ActiveRecord::Base.connection.execute('Select * from contact_inboxes;')
|
||||||
expect(results.first['pubsub_token']).to eq(nil)
|
expect(results.first['pubsub_token']).to be_nil
|
||||||
|
|
||||||
new_token = obj.pubsub_token
|
new_token = obj.pubsub_token
|
||||||
obj.update(source_id: '234234323')
|
obj.update(source_id: '234234323')
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue