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