intercom-rails 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,7 @@
1
1
  require 'intercom-rails/exceptions'
2
- require 'intercom-rails/user_proxy'
2
+ require 'intercom-rails/proxy'
3
+ require 'intercom-rails/proxy/user'
4
+ require 'intercom-rails/proxy/company'
3
5
  require 'intercom-rails/script_tag'
4
6
  require 'intercom-rails/script_tag_helper'
5
7
  require 'intercom-rails/custom_data_helper'
@@ -46,7 +46,7 @@ module IntercomRails
46
46
  end
47
47
 
48
48
  def intercom_script_tag
49
- @script_tag ||= ScriptTag.new(:find_current_user_details => true, :controller => controller)
49
+ @script_tag ||= ScriptTag.new(:find_current_user_details => true, :find_current_company_details => true, :controller => controller)
50
50
  end
51
51
 
52
52
  end
@@ -1,99 +1,91 @@
1
- module IntercomRails
2
-
3
- module Config
4
-
5
- def self.reset!
6
- [self, InboxConfig].each do |configer|
7
- configer.instance_variables.each do |var|
8
- configer.send(:remove_instance_variable, var)
9
- end
10
- end
11
- end
12
-
13
- # Your Intercom app_id
14
- def self.app_id=(value)
15
- @app_id = value
16
- end
1
+ class Module
17
2
 
18
- def self.app_id
19
- @app_id
20
- end
3
+ def config_accessor(*args, &block)
4
+ config_reader(*args)
5
+ config_writer(*args, &block)
6
+ end
21
7
 
22
- # Intercom api secret, for secure mode
23
- def self.api_secret=(value)
24
- @api_secret = value
8
+ def config_reader(name)
9
+ self.send(:define_singleton_method, name) do
10
+ instance_variable_get("@#{name}")
25
11
  end
12
+ end
26
13
 
27
- def self.api_secret
28
- @api_secret
14
+ def config_writer(name, &block)
15
+ self.send(:define_singleton_method, "#{name}=") do |value|
16
+ block.call(value) if block
17
+ instance_variable_set("@#{name}", value)
29
18
  end
19
+ end
30
20
 
31
- # Intercom API key, for some rake tasks
32
- def self.api_key=(value)
33
- @api_key = value
34
- end
21
+ def config_group(name, &block)
22
+ camelized_name = name.to_s.split('_').map { |s| s[0].upcase + s[1..-1] }.join('')
23
+ group = self.const_set(camelized_name, Module.new)
35
24
 
36
- def self.api_key
37
- @api_key
25
+ self.send(:define_singleton_method, name) do
26
+ group
38
27
  end
39
28
 
40
- # How is the current logged in user accessed in your controllers?
41
- def self.current_user=(value)
42
- raise ArgumentError, "current_user should be a Proc" unless value.kind_of?(Proc)
43
- @current_user = value
44
- end
29
+ group.instance_eval(&block)
30
+ end
45
31
 
46
- def self.current_user
47
- @current_user
48
- end
32
+ end
49
33
 
50
- # What class defines your user model?
51
- def self.user_model=(value)
52
- raise ArgumentError, "user_model should be a Proc" unless value.kind_of?(Proc)
53
- @user_model = value
54
- end
34
+ module IntercomRails
55
35
 
56
- def self.user_model
57
- @user_model
58
- end
36
+ module Config
59
37
 
60
- # Widget options
61
- def self.inbox
62
- InboxConfig
63
- end
38
+ def self.reset!
39
+ to_reset = self.constants.map {|c| const_get c}
40
+ to_reset << self
64
41
 
65
- def self.custom_data=(value)
66
- raise ArgumentError, "custom_data should be a hash" unless value.kind_of?(Hash)
67
- unless value.reject { |_,v| v.kind_of?(Proc) || v.kind_of?(Symbol) }.count.zero?
68
- raise ArgumentError, "all custom_data attributes should be either a Proc or a symbol"
42
+ to_reset.each do |configer|
43
+ configer.instance_variables.each do |var|
44
+ configer.send(:remove_instance_variable, var)
45
+ end
69
46
  end
70
-
71
- @custom_data = value
72
- end
73
-
74
- def self.custom_data
75
- @custom_data
76
47
  end
48
+
49
+ config_accessor :app_id
50
+ config_accessor :api_secret
51
+ config_accessor :api_key
77
52
 
78
- end
53
+ config_group :user do
54
+ config_accessor :current do |value|
55
+ raise ArgumentError, "user.current should be a Proc" unless value.kind_of?(Proc)
56
+ end
79
57
 
80
- module InboxConfig
58
+ config_accessor :model do |value|
59
+ raise ArgumentError, "user.model should be a Proc" unless value.kind_of?(Proc)
60
+ end
81
61
 
82
- def self.style=(value)
83
- raise ArgumentError, "inbox.style must be one of :default or :custom" unless [:default, :custom].include?(value)
84
- @style = value
62
+ config_accessor :custom_data do |value|
63
+ raise ArgumentError, "user.custom_data should be a hash" unless value.kind_of?(Hash)
64
+ unless value.reject { |_,v| v.kind_of?(Proc) || v.kind_of?(Symbol) }.count.zero?
65
+ raise ArgumentError, "all custom_data attributes should be either a Proc or a symbol"
66
+ end
67
+ end
85
68
  end
69
+
70
+ config_group :company do
71
+ config_accessor :current do |value|
72
+ raise ArgumentError, "company.current should be a Proc" unless value.kind_of?(Proc)
73
+ end
86
74
 
87
- def self.style
88
- @style
75
+ config_accessor :custom_data do |value|
76
+ raise ArgumentError, "company.custom_data should be a hash" unless value.kind_of?(Hash)
77
+ unless value.reject { |_,v| v.kind_of?(Proc) || v.kind_of?(Symbol) }.count.zero?
78
+ raise ArgumentError, "all custom_data attributes should be either a Proc or a symbol"
79
+ end
80
+ end
89
81
  end
90
82
 
91
- def self.counter=(value)
92
- @counter = value
93
- end
83
+ config_group :inbox do
84
+ config_accessor :counter
94
85
 
95
- def self.counter
96
- @counter
86
+ config_accessor :style do |value|
87
+ raise ArgumentError, "inbox.style must be one of :default or :custom" unless [:default, :custom].include?(value)
88
+ end
97
89
  end
98
90
 
99
91
  end
@@ -6,11 +6,16 @@ module IntercomRails
6
6
  # for the current request from within the controller. e.g.
7
7
  #
8
8
  # def destroy
9
- # intercom_custom_data['canceled_at'] = Time.now
9
+ # intercom_custom_data.user['canceled_at'] = Time.now
10
10
  # ...
11
11
  # end
12
12
  def intercom_custom_data
13
- @_request_specific_intercom_custom_data ||= {}
13
+ @_request_specific_intercom_custom_data ||= begin
14
+ s = Struct.new(:user, :company).new
15
+ s.user = {}
16
+ s.company = {}
17
+ s
18
+ end
14
19
  end
15
20
 
16
21
  end
@@ -1,9 +1,9 @@
1
1
  module IntercomRails
2
2
 
3
3
  class Error < StandardError; end
4
-
5
- class NoUserFoundError < Error; end
6
4
  class ImportError < Error; end
7
5
  class IntercomAPIError < Error; end
6
+ class NoUserFoundError < Error; end
7
+ class NoCompanyFoundError < Error; end
8
8
 
9
9
  end
@@ -69,7 +69,7 @@ module IntercomRails
69
69
  def batches
70
70
  user_klass.find_in_batches(:batch_size => MAX_BATCH_SIZE) do |users|
71
71
  users_for_wire = users.map do |u|
72
- user_proxy = UserProxy.new(u)
72
+ user_proxy = Proxy::User.new(u)
73
73
  user_proxy.valid? ? user_proxy.to_hash : nil
74
74
  end.compact
75
75
 
@@ -82,8 +82,8 @@ module IntercomRails
82
82
  end
83
83
 
84
84
  def user_klass
85
- if IntercomRails.config.user_model.present?
86
- IntercomRails.config.user_model.call
85
+ if IntercomRails.config.user.model.present?
86
+ IntercomRails.config.user.model.call
87
87
  else
88
88
  User
89
89
  end
@@ -0,0 +1,81 @@
1
+ module IntercomRails
2
+
3
+ module Proxy
4
+
5
+ class Proxy
6
+
7
+ def self.class_string
8
+ self.to_s.split('::').last
9
+ end
10
+
11
+ def self.inherited(subclass)
12
+ subclass.class_eval do
13
+ attr_reader class_string.downcase.to_s
14
+ end
15
+ end
16
+
17
+ attr_reader :search_object, :proxied_object
18
+
19
+ def initialize(object_to_proxy, search_object = nil)
20
+ @search_object = search_object
21
+ @proxied_object = instance_variable_set(:"@#{type}", object_to_proxy)
22
+ end
23
+
24
+ def to_hash
25
+ standard_data.merge custom_data
26
+ end
27
+
28
+ def custom_data
29
+ custom_data_from_config.merge custom_data_from_request
30
+ end
31
+
32
+ protected
33
+
34
+ def attribute_present?(attribute)
35
+ proxied_object.respond_to?(attribute) && proxied_object.send(attribute).present?
36
+ end
37
+
38
+ def self.type
39
+ self.class_string.downcase.to_sym
40
+ end
41
+
42
+ def type
43
+ self.class.type
44
+ end
45
+
46
+ def self.config
47
+ IntercomRails.config.send(type)
48
+ end
49
+
50
+ def config
51
+ self.class.config
52
+ end
53
+
54
+ private
55
+
56
+ def custom_data_from_request
57
+ search_object.intercom_custom_data.send(type)
58
+ rescue NoMethodError
59
+ {}
60
+ end
61
+
62
+ def custom_data_from_config
63
+ return {} if config.custom_data.blank?
64
+ config.custom_data.reduce({}) do |custom_data, (k,v)|
65
+ custom_data.merge(k => custom_data_value_from_proc_or_symbol(v))
66
+ end
67
+ end
68
+
69
+ def custom_data_value_from_proc_or_symbol(proc_or_symbol)
70
+ if proc_or_symbol.kind_of?(Symbol)
71
+ proxied_object.send(proc_or_symbol)
72
+ elsif proc_or_symbol.kind_of?(Proc)
73
+ proc_or_symbol.call(proxied_object)
74
+ end
75
+ end
76
+
77
+ end
78
+
79
+ end
80
+
81
+ end
@@ -0,0 +1,35 @@
1
+ module IntercomRails
2
+
3
+ module Proxy
4
+
5
+ class Company < Proxy
6
+
7
+ def self.current_in_context(search_object)
8
+ begin
9
+ if config.current.present?
10
+ company_proxy = new(search_object.instance_eval(&config.current), search_object)
11
+ return company_proxy if company_proxy.valid?
12
+ end
13
+ rescue NameError
14
+ end
15
+
16
+ raise NoCompanyFoundError
17
+ end
18
+
19
+ def valid?
20
+ company.respond_to?(:id) && company.id.present?
21
+ end
22
+
23
+ def standard_data
24
+ hsh = {}
25
+ hsh[:id] = company.id
26
+ hsh[:name] = company.name if attribute_present?(:name)
27
+ hsh[:created_at] = company.created_at if attribute_present?(:created_at)
28
+ hsh
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,48 @@
1
+ module IntercomRails
2
+
3
+ module Proxy
4
+
5
+ class User < Proxy
6
+
7
+ POTENTIAL_USER_OBJECTS = [
8
+ Proc.new { instance_eval &IntercomRails.config.user.current if IntercomRails.config.user.current.present? },
9
+ Proc.new { current_user },
10
+ Proc.new { @user }
11
+ ]
12
+
13
+ def self.current_in_context(search_object)
14
+ POTENTIAL_USER_OBJECTS.each do |potential_object|
15
+ begin
16
+ user_proxy = new(search_object.instance_eval(&potential_object), search_object)
17
+ return user_proxy if user_proxy.valid?
18
+ rescue NameError
19
+ next
20
+ end
21
+ end
22
+
23
+ raise NoUserFoundError
24
+ end
25
+
26
+ def standard_data
27
+ hsh = {}
28
+
29
+ hsh[:user_id] = user.id if attribute_present?(:id)
30
+ [:email, :name, :created_at].each do |attribute|
31
+ hsh[attribute] = user.send(attribute) if attribute_present?(attribute)
32
+ end
33
+
34
+ hsh
35
+ end
36
+
37
+ def valid?
38
+ return false if user.blank?
39
+ return true if user.respond_to?(:id) && user.id.present?
40
+ return true if user.respond_to?(:email) && user.email.present?
41
+ false
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -9,7 +9,7 @@ module IntercomRails
9
9
  new(*args).output
10
10
  end
11
11
 
12
- attr_reader :user_details
12
+ attr_reader :user_details, :company_details
13
13
  attr_accessor :secret, :widget_options, :controller
14
14
 
15
15
  def initialize(options = {})
@@ -17,6 +17,11 @@ module IntercomRails
17
17
  self.widget_options = widget_options_from_config.merge(options[:widget] || {})
18
18
  self.controller = options[:controller]
19
19
  self.user_details = options[:find_current_user_details] ? find_current_user_details : options[:user_details]
20
+ self.company_details = if options[:find_current_company_details]
21
+ find_current_company_details
22
+ elsif options[:user_details]
23
+ options[:user_details].delete(:company) if options[:user_details]
24
+ end
20
25
  end
21
26
 
22
27
  def valid?
@@ -24,10 +29,10 @@ module IntercomRails
24
29
  end
25
30
 
26
31
  def intercom_settings
27
- options = {}
28
- options[:widget] = widget_options if widget_options.present?
29
-
30
- user_details.merge(options)
32
+ hsh = user_details
33
+ hsh[:widget] = widget_options if widget_options.present?
34
+ hsh[:company] = company_details if company_details.present?
35
+ hsh
31
36
  end
32
37
 
33
38
  def output
@@ -69,11 +74,25 @@ module IntercomRails
69
74
 
70
75
  def find_current_user_details
71
76
  return {} unless controller.present?
72
- UserProxy.from_current_user_in_object(controller).to_hash
77
+ Proxy::User.current_in_context(controller).to_hash
73
78
  rescue NoUserFoundError
74
79
  {}
75
80
  end
76
81
 
82
+ def company_details=(company_details)
83
+ @company_details = convert_dates_to_unix_timestamps(company_details || {})
84
+ @company_details = @company_details.with_indifferent_access.tap do |c|
85
+ [:id, :name].each { |k| c.delete(k) if c[k].nil? }
86
+ end
87
+ end
88
+
89
+ def find_current_company_details
90
+ return {} unless controller.present?
91
+ Proxy::Company.current_in_context(controller).to_hash
92
+ rescue NoCompanyFoundError
93
+ {}
94
+ end
95
+
77
96
  def user_hash
78
97
  components = [secret, (user_details[:user_id] || user_details[:email])]
79
98
  Digest::SHA1.hexdigest(components.join)
@@ -31,6 +31,7 @@ module IntercomRails
31
31
  controller.instance_variable_set(IntercomRails::SCRIPT_TAG_HELPER_CALLED_INSTANCE_VARIABLE, true) if defined?(controller)
32
32
  options[:user_details] = user_details if user_details.present?
33
33
  options[:find_current_user_details] = !options[:user_details]
34
+ options[:find_current_company_details] = !(options[:user_details] && options[:user_details][:company])
34
35
  options[:controller] = controller if defined?(controller)
35
36
 
36
37
  ScriptTag.generate(options)
@@ -1,3 +1,3 @@
1
1
  module IntercomRails
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -10,7 +10,7 @@ IntercomRails.config do |config|
10
10
  <%- if @api_secret -%>
11
11
  config.api_secret = "<%= @api_secret %>"
12
12
  <%- else -%>
13
- # config.api_secret = '...'
13
+ # config.api_secret = "..."
14
14
  <%- end -%>
15
15
 
16
16
  # == Intercom API Key
@@ -27,23 +27,41 @@ IntercomRails.config do |config|
27
27
  # The method/variable that contains the logged in user in your controllers.
28
28
  # If it is `current_user` or `@user`, then you can ignore this
29
29
  #
30
- # config.current_user = Proc.new { current_user }
30
+ # config.user.current = Proc.new { current_user }
31
31
 
32
32
  # == User model class
33
33
  # The class which defines your user model
34
34
  #
35
- # config.user_model = Proc.new { User }
35
+ # config.user.model = Proc.new { User }
36
36
 
37
- # == Custom Data
37
+ # == User Custom Data
38
38
  # A hash of additional data you wish to send about your users.
39
39
  # You can provide either a method name which will be sent to the current
40
40
  # user object, or a Proc which will be passed the current user.
41
41
  #
42
- # config.custom_data = {
43
- # 'plan' => Proc.new { |current_user| current_user.plan.name },
44
- # 'favorite_color' => :favorite_color
42
+ # config.user.custom_data = {
43
+ # :plan => Proc.new { |current_user| current_user.plan.name },
44
+ # :favorite_color => :favorite_color
45
45
  # }
46
-
46
+
47
+ <%- if @app_id == 'tx2p130c' -%>
48
+ # == Current company name
49
+ # The method/variable that contains the current company for the current user,
50
+ # in your controllers. 'Companies' are generic groupings of users, so this
51
+ # could be a company, app or group.
52
+ #
53
+ # config.company.current = Proc.new { @app }
54
+
55
+ # == Company Custom Data
56
+ # A hash of additional data you wish to send about a company.
57
+ # This works the same as User custom data above.
58
+ #
59
+ # config.company.custom_data = {
60
+ # :number_of_messages => Proc.new { |app| app.messages.count },
61
+ # :is_interesting => :is_interesting?
62
+ # }
63
+ <%- end -%>
64
+
47
65
  # == Inbox Style
48
66
  # This enables the Intercom inbox which allows your users to read their
49
67
  # past conversations with your app, as well as start new ones. It is
@@ -10,10 +10,16 @@ class TestController < ActionController::Base
10
10
  @user = dummy_user
11
11
  render :text => params[:body], :content_type => 'text/html'
12
12
  end
13
+
14
+ def with_user_and_app_instance_variables
15
+ @user = dummy_user
16
+ @app = dummy_company
17
+ render :text => params[:body], :content_type => 'text/html'
18
+ end
13
19
 
14
20
  def with_user_instance_variable_and_custom_data
15
21
  @user = dummy_user
16
- intercom_custom_data['testing_stuff'] = true
22
+ intercom_custom_data.user['testing_stuff'] = true
17
23
  render :text => params[:body], :content_type => 'text/html'
18
24
  end
19
25
 
@@ -80,7 +86,6 @@ class AutoIncludeFilterTest < ActionController::TestCase
80
86
  def test_user_instance_variable_present_with_body_tag_and_custom_data
81
87
  get :with_user_instance_variable_and_custom_data, :body => "<body>Hello world</body>"
82
88
  assert_includes @response.body, "<script>"
83
- assert_includes @response.body, "custom_data"
84
89
  assert_includes @response.body, "testing_stuff"
85
90
  end
86
91
 
@@ -93,8 +98,7 @@ class AutoIncludeFilterTest < ActionController::TestCase
93
98
  end
94
99
 
95
100
  def test_setting_current_user_with_intercom_config
96
- IntercomRails.config.current_user = Proc.new { @admin }
97
-
101
+ IntercomRails.config.user.current = Proc.new { @admin }
98
102
  get :with_admin_instance_variable, :body => "<body>Hello world</body>"
99
103
 
100
104
  assert_includes @response.body, "<script>"
@@ -105,6 +109,7 @@ class AutoIncludeFilterTest < ActionController::TestCase
105
109
  def test_auto_insert_with_api_secret_set
106
110
  IntercomRails.config.api_secret = 'abcd'
107
111
  get :with_current_user_method, :body => "<body>Hello world</body>"
112
+
108
113
  assert_includes @response.body, "<script>"
109
114
  assert_includes @response.body, "user_hash"
110
115
  assert_includes @response.body, Digest::SHA1.hexdigest('abcd' + @controller.current_user.email)
@@ -126,4 +131,13 @@ class AutoIncludeFilterTest < ActionController::TestCase
126
131
  assert_equal @response.body, "<body>Hello world</body>"
127
132
  end
128
133
 
134
+ def test_includes_company
135
+ IntercomRails.config.company.current = Proc.new { @app }
136
+ get :with_user_and_app_instance_variables, :body => "<body>Hello world</body>"
137
+
138
+ assert_includes @response.body, "<script>"
139
+ assert_includes @response.body, "company"
140
+ assert_includes @response.body, "6"
141
+ end
142
+
129
143
  end
@@ -11,13 +11,13 @@ class ConfigTest < MiniTest::Unit::TestCase
11
11
 
12
12
  def test_setting_current_user
13
13
  current_user = Proc.new { @blah }
14
- IntercomRails.config.current_user = current_user
15
- assert_equal IntercomRails.config.current_user, current_user
14
+ IntercomRails.config.user.current = current_user
15
+ assert_equal IntercomRails.config.user.current, current_user
16
16
  end
17
17
 
18
18
  def test_setting_current_user_not_to_a_proc
19
19
  assert_raises ArgumentError do
20
- IntercomRails.config.current_user = 1
20
+ IntercomRails.config.user.current = 1
21
21
  end
22
22
  end
23
23
 
@@ -31,7 +31,7 @@ class ConfigTest < MiniTest::Unit::TestCase
31
31
 
32
32
  def test_custom_data_rejects_non_proc_or_symbol_attributes
33
33
  exception = assert_raises ArgumentError do
34
- IntercomRails.config.custom_data = {
34
+ IntercomRails.config.user.custom_data = {
35
35
  'foo' => Proc.new {},
36
36
  'bar' => 'heyheyhey!'
37
37
  }
@@ -46,14 +46,19 @@ class ConfigTest < MiniTest::Unit::TestCase
46
46
  'bar' => :method_name
47
47
  }
48
48
 
49
- IntercomRails.config.custom_data = custom_data_config
50
- assert_equal custom_data_config, IntercomRails.config.custom_data
49
+ IntercomRails.config.user.custom_data = custom_data_config
50
+ assert_equal custom_data_config, IntercomRails.config.user.custom_data
51
+ end
52
+
53
+ def test_setting_inbox_style
54
+ IntercomRails.config.inbox.style = :custom
55
+ assert_equal :custom, IntercomRails.config.inbox.style
51
56
  end
52
57
 
53
58
  def test_reset_clears_existing_config
54
- IntercomRails.config.custom_data = {'muffin' => :muffin}
59
+ IntercomRails.config.user.custom_data = {'muffin' => :muffin}
55
60
  IntercomRails.config.reset!
56
- assert_equal nil, IntercomRails.config.custom_data
61
+ assert_equal nil, IntercomRails.config.user.custom_data
57
62
  end
58
63
 
59
64
  def test_reset_clears_inbox_config_too
@@ -0,0 +1,21 @@
1
+ require 'test_setup'
2
+
3
+ class CompanyTest < MiniTest::Unit::TestCase
4
+
5
+ include InterTest
6
+
7
+ Company = IntercomRails::Proxy::Company
8
+ DUMMY_COMPANY = dummy_company
9
+
10
+ def test_finds_current_company
11
+ IntercomRails.config.company.current = Proc.new { @app }
12
+ object_with_app_instance_var = Object.new
13
+ object_with_app_instance_var.instance_variable_set(:@app, DUMMY_COMPANY)
14
+
15
+ c = Company.current_in_context(object_with_app_instance_var)
16
+ assert_equal true, c.valid?
17
+ expected_hash = {:id => '6', :name => 'Intercom'}
18
+ assert_equal expected_hash, c.to_hash
19
+ end
20
+
21
+ end
@@ -1,6 +1,8 @@
1
1
  require 'test_setup'
2
2
 
3
- class UserProxyTest < MiniTest::Unit::TestCase
3
+ class UserTest < MiniTest::Unit::TestCase
4
+
5
+ User = IntercomRails::Proxy::User
4
6
 
5
7
  include InterTest
6
8
  include IntercomRails
@@ -9,7 +11,7 @@ class UserProxyTest < MiniTest::Unit::TestCase
9
11
 
10
12
  def test_raises_error_when_no_user_found
11
13
  assert_raises(IntercomRails::NoUserFoundError) {
12
- UserProxy.from_current_user_in_object(Object.new)
14
+ User.current_in_context(Object.new)
13
15
  }
14
16
  end
15
17
 
@@ -21,7 +23,7 @@ class UserProxyTest < MiniTest::Unit::TestCase
21
23
  end
22
24
  end
23
25
 
24
- @user_proxy = UserProxy.from_current_user_in_object(object_with_current_user_method)
26
+ @user_proxy = User.current_in_context(object_with_current_user_method)
25
27
  assert_user_found
26
28
  end
27
29
 
@@ -31,7 +33,7 @@ class UserProxyTest < MiniTest::Unit::TestCase
31
33
  @user = DUMMY_USER
32
34
  end
33
35
 
34
- @user_proxy = UserProxy.from_current_user_in_object(object_with_instance_variable)
36
+ @user_proxy = User.current_in_context(object_with_instance_variable)
35
37
  assert_user_found
36
38
  end
37
39
 
@@ -43,8 +45,8 @@ class UserProxyTest < MiniTest::Unit::TestCase
43
45
  end
44
46
  end
45
47
 
46
- IntercomRails.config.current_user = Proc.new { something_esoteric }
47
- @user_proxy = UserProxy.from_current_user_in_object(object_from_config)
48
+ IntercomRails.config.user.current = Proc.new { something_esoteric }
49
+ @user_proxy = User.current_in_context(object_from_config)
48
50
  assert_user_found
49
51
  end
50
52
 
@@ -60,36 +62,41 @@ class UserProxyTest < MiniTest::Unit::TestCase
60
62
  end
61
63
  end
62
64
 
63
- IntercomRails.config.custom_data = {
65
+ IntercomRails.config.user.custom_data = {
64
66
  'plan' => :plan
65
67
  }
66
68
 
67
- @user_proxy = UserProxy.new(plan_dummy_user)
68
- expected_custom_data = {'plan' => 'pro'}
69
- assert_equal expected_custom_data, @user_proxy.to_hash[:custom_data]
69
+ @user_proxy = User.new(plan_dummy_user)
70
+ assert_equal 'pro', @user_proxy.to_hash['plan']
70
71
  end
71
72
 
72
73
  def test_valid_returns_true_if_user_id_or_email
73
- assert_equal true, UserProxy.new(DUMMY_USER).valid?
74
+ assert_equal true, User.new(DUMMY_USER).valid?
74
75
  end
75
76
 
76
77
  def test_includes_custom_data_from_intercom_custom_data
77
78
  object_with_intercom_custom_data = Object.new
78
79
  object_with_intercom_custom_data.instance_eval do
79
80
  def intercom_custom_data
80
- {:ponies => :rainbows}
81
+ o = Object.new
82
+ o.instance_eval do
83
+ def user
84
+ {:ponies => :rainbows}
85
+ end
86
+ end
87
+
88
+ o
81
89
  end
82
90
  end
83
91
 
84
- @user_proxy = UserProxy.new(DUMMY_USER, object_with_intercom_custom_data)
85
- expected_custom_data = {:ponies => :rainbows}
86
- assert_equal expected_custom_data, @user_proxy.to_hash[:custom_data]
92
+ @user_proxy = User.new(DUMMY_USER, object_with_intercom_custom_data)
93
+ assert_equal :rainbows, @user_proxy.to_hash[:ponies]
87
94
  end
88
95
 
89
96
  def test_valid_returns_false_for_nil
90
97
  search_object = false
91
98
  search_object.stub(:id) { raise NameError }
92
- assert_equal false, UserProxy.new(search_object).valid?
99
+ assert_equal false, User.new(search_object).valid?
93
100
  end
94
101
 
95
102
  end
@@ -87,5 +87,17 @@ class ScriptTagTest < MiniTest::Unit::TestCase
87
87
  assert_equal expected_widget_settings, script_tag.intercom_settings['widget']
88
88
  end
89
89
 
90
+ def test_company_discovery_and_inclusion
91
+ IntercomRails.config.company.current = Proc.new { @app }
92
+ object_with_app_instance_variable = Object.new
93
+ object_with_app_instance_variable.instance_eval do
94
+ @app = dummy_company
95
+ end
96
+
97
+ script_tag = ScriptTag.new(:controller => object_with_app_instance_variable,
98
+ :find_current_company_details => true)
99
+ expected_company = {'id' => '6', 'name' => 'Intercom'}
100
+ assert_equal expected_company, script_tag.intercom_settings[:company]
101
+ end
90
102
 
91
103
  end
data/test/test_setup.rb CHANGED
@@ -10,6 +10,13 @@ def dummy_user(options = {})
10
10
  user
11
11
  end
12
12
 
13
+ def dummy_company(options = {})
14
+ company = Struct.new(:id, :name).new
15
+ company.id = options[:id] || '6'
16
+ company.name = options[:name] || 'Intercom'
17
+ company
18
+ end
19
+
13
20
  def fake_action_view_class
14
21
  klass = Class.new(ActionView::Base)
15
22
  klass.class_eval do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: intercom-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -143,10 +143,12 @@ files:
143
143
  - lib/intercom-rails/exceptions.rb
144
144
  - lib/intercom-rails/import.rb
145
145
  - lib/intercom-rails/intercom.rake
146
+ - lib/intercom-rails/proxy/company.rb
147
+ - lib/intercom-rails/proxy/user.rb
148
+ - lib/intercom-rails/proxy.rb
146
149
  - lib/intercom-rails/railtie.rb
147
150
  - lib/intercom-rails/script_tag.rb
148
151
  - lib/intercom-rails/script_tag_helper.rb
149
- - lib/intercom-rails/user_proxy.rb
150
152
  - lib/intercom-rails/version.rb
151
153
  - lib/intercom-rails.rb
152
154
  - lib/rails/generators/intercom/config/config_generator.rb
@@ -160,9 +162,10 @@ files:
160
162
  - test/intercom-rails/config_test.rb
161
163
  - test/intercom-rails/import_network_test.rb
162
164
  - test/intercom-rails/import_unit_test.rb
165
+ - test/intercom-rails/proxy/company_test.rb
166
+ - test/intercom-rails/proxy/user_test.rb
163
167
  - test/intercom-rails/script_tag_helper_test.rb
164
168
  - test/intercom-rails/script_tag_test.rb
165
- - test/intercom-rails/user_proxy_test.rb
166
169
  - test/test_setup.rb
167
170
  homepage: http://www.intercom.io
168
171
  licenses: []
@@ -178,7 +181,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
178
181
  version: '0'
179
182
  segments:
180
183
  - 0
181
- hash: 2121047111901162592
184
+ hash: -893769769593597927
182
185
  required_rubygems_version: !ruby/object:Gem::Requirement
183
186
  none: false
184
187
  requirements:
@@ -187,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
187
190
  version: '0'
188
191
  segments:
189
192
  - 0
190
- hash: 2121047111901162592
193
+ hash: -893769769593597927
191
194
  requirements: []
192
195
  rubyforge_project: intercom-rails
193
196
  rubygems_version: 1.8.23
@@ -201,7 +204,8 @@ test_files:
201
204
  - test/intercom-rails/config_test.rb
202
205
  - test/intercom-rails/import_network_test.rb
203
206
  - test/intercom-rails/import_unit_test.rb
207
+ - test/intercom-rails/proxy/company_test.rb
208
+ - test/intercom-rails/proxy/user_test.rb
204
209
  - test/intercom-rails/script_tag_helper_test.rb
205
210
  - test/intercom-rails/script_tag_test.rb
206
- - test/intercom-rails/user_proxy_test.rb
207
211
  - test/test_setup.rb
@@ -1,84 +0,0 @@
1
- module IntercomRails
2
-
3
- class UserProxy
4
-
5
- POTENTIAL_USER_OBJECTS = [
6
- Proc.new { instance_eval &IntercomRails.config.current_user if IntercomRails.config.current_user.present? },
7
- Proc.new { current_user },
8
- Proc.new { @user }
9
- ]
10
-
11
- def self.from_current_user_in_object(search_object)
12
- POTENTIAL_USER_OBJECTS.each do |potential_user|
13
- begin
14
- user_proxy = new(search_object.instance_eval(&potential_user), search_object)
15
- return user_proxy if user_proxy.valid?
16
- rescue NameError
17
- next
18
- end
19
- end
20
-
21
- raise NoUserFoundError
22
- end
23
-
24
- attr_reader :search_object, :user
25
-
26
- def initialize(user, search_object = nil)
27
- @user = user
28
- @search_object = search_object
29
- end
30
-
31
- def to_hash
32
- hsh = {}
33
-
34
- hsh[:user_id] = user.id if attribute_present?(:id)
35
- [:email, :name, :created_at].each do |attribute|
36
- hsh[attribute] = user.send(attribute) if attribute_present?(attribute)
37
- end
38
-
39
- hsh[:custom_data] = custom_data
40
- hsh.delete(:custom_data) unless hsh[:custom_data].present?
41
-
42
- hsh
43
- end
44
-
45
- def custom_data
46
- custom_data_from_config.merge custom_data_from_request
47
- end
48
-
49
- def valid?
50
- return false if user.blank?
51
- return true if user.respond_to?(:id) && user.id.present?
52
- return true if user.respond_to?(:email) && user.email.present?
53
- false
54
- end
55
-
56
- private
57
- def attribute_present?(attribute)
58
- user.respond_to?(attribute) && user.send(attribute).present?
59
- end
60
-
61
- def custom_data_value_from_proc_or_symbol(proc_or_symbol)
62
- if proc_or_symbol.kind_of?(Symbol)
63
- user.send(proc_or_symbol)
64
- elsif proc_or_symbol.kind_of?(Proc)
65
- proc_or_symbol.call(user)
66
- end
67
- end
68
-
69
- def custom_data_from_request
70
- search_object.intercom_custom_data
71
- rescue NoMethodError
72
- {}
73
- end
74
-
75
- def custom_data_from_config
76
- return {} if Config.custom_data.blank?
77
- Config.custom_data.reduce({}) do |custom_data, (k,v)|
78
- custom_data.merge(k => custom_data_value_from_proc_or_symbol(v))
79
- end
80
- end
81
-
82
- end
83
-
84
- end