chore: Update dependencies to the latest versions (#5033)

This commit is contained in:
Sojan Jose 2022-07-15 04:51:59 +02:00 committed by GitHub
parent ea1a27c7d4
commit 4187428729
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
122 changed files with 546 additions and 526 deletions

View file

@ -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

View file

@ -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'

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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? }

View file

@ -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

View file

@ -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

View file

@ -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

View 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

View file

@ -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

View file

@ -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

View file

@ -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 }

View file

@ -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?

View file

@ -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

View file

@ -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

View file

@ -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?

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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']

View file

@ -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.

View file

@ -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'

View file

@ -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

View file

@ -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?

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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",

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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

View file

@ -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')

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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:

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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" }))

View file

@ -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

View file

@ -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

View file

@ -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