intercom-rails 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,8 @@
1
1
  require 'intercom-rails/exceptions'
2
- require 'intercom-rails/current_user'
2
+ require 'intercom-rails/user_proxy'
3
3
  require 'intercom-rails/script_tag'
4
4
  require 'intercom-rails/script_tag_helper'
5
+ require 'intercom-rails/custom_data_helper'
5
6
  require 'intercom-rails/auto_include_filter'
6
7
  require 'intercom-rails/config'
7
8
  require 'intercom-rails/import'
@@ -2,6 +2,14 @@ module IntercomRails
2
2
 
3
3
  module Config
4
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
+
5
13
  # Your Intercom app_id
6
14
  def self.app_id=(value)
7
15
  @app_id = value
@@ -50,13 +58,42 @@ module IntercomRails
50
58
  end
51
59
 
52
60
  # Widget options
53
- def self.inbox=(value)
54
- raise ArgumentError, "inbox must be one of :default or :custom" unless [:default, :custom].include?(value)
55
- @inbox = value
61
+ def self.inbox
62
+ InboxConfig
56
63
  end
57
64
 
58
- def self.inbox
59
- @inbox
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"
69
+ end
70
+
71
+ @custom_data = value
72
+ end
73
+
74
+ def self.custom_data
75
+ @custom_data
76
+ end
77
+
78
+ end
79
+
80
+ module InboxConfig
81
+
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
85
+ end
86
+
87
+ def self.style
88
+ @style
89
+ end
90
+
91
+ def self.counter=(value)
92
+ @counter = value
93
+ end
94
+
95
+ def self.counter
96
+ @counter
60
97
  end
61
98
 
62
99
  end
@@ -0,0 +1,18 @@
1
+ module IntercomRails
2
+
3
+ module CustomDataHelper
4
+
5
+ # This helper allows custom data attributes to be added to a user
6
+ # for the current request from within the controller. e.g.
7
+ #
8
+ # def destroy
9
+ # intercom_custom_data['canceled_at'] = Time.now
10
+ # ...
11
+ # end
12
+ def intercom_custom_data
13
+ @_request_specific_intercom_custom_data ||= {}
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -2,7 +2,7 @@ module IntercomRails
2
2
 
3
3
  class Error < StandardError; end
4
4
 
5
- class CurrentUserNotFoundError < Error; end
5
+ class NoUserFoundError < Error; end
6
6
  class ImportError < Error; end
7
7
  class IntercomAPIError < Error; end
8
8
 
@@ -68,7 +68,11 @@ module IntercomRails
68
68
  MAX_BATCH_SIZE = 100
69
69
  def batches
70
70
  user_klass.find_in_batches(:batch_size => MAX_BATCH_SIZE) do |users|
71
- users_for_wire = users.map { |u| user_for_wire(u) }.compact
71
+ users_for_wire = users.map do |u|
72
+ user_proxy = UserProxy.new(u)
73
+ user_proxy.valid? ? user_proxy.to_hash : nil
74
+ end.compact
75
+
72
76
  yield(prepare_batch(users_for_wire), users_for_wire.count) unless users_for_wire.count.zero?
73
77
  end
74
78
  end
@@ -77,16 +81,6 @@ module IntercomRails
77
81
  {:users => batch}.to_json
78
82
  end
79
83
 
80
- def user_for_wire(user)
81
- wired = {}.tap do |h|
82
- h[:user_id] = user.id if user.respond_to?(:id) && user.id.present?
83
- h[:email] = user.email if user.respond_to?(:email) && user.email.present?
84
- h[:name] = user.name if user.respond_to?(:name) && user.name.present?
85
- end
86
-
87
- (wired[:user_id] || wired[:email]) ? wired : nil
88
- end
89
-
90
84
  def user_klass
91
85
  if IntercomRails.config.user_model.present?
92
86
  IntercomRails.config.user_model.call
@@ -1,11 +1,9 @@
1
1
  module IntercomRails
2
2
  class Railtie < Rails::Railtie
3
- initializer "intercom_on_rails.script_tag_helper.rb" do |app|
3
+ initializer "intercom-rails" do |app|
4
4
  ActionView::Base.send :include, ScriptTagHelper
5
- end
6
-
7
- initializer "intercom_on_rails.auto_include_filter.rb" do |app|
8
- ActionController::Base.send :after_filter, AutoIncludeFilter
5
+ ActionController::Base.send :include, CustomDataHelper
6
+ ActionController::Base.send :after_filter, AutoIncludeFilter
9
7
  end
10
8
 
11
9
  rake_tasks do
@@ -14,7 +14,7 @@ module IntercomRails
14
14
 
15
15
  def initialize(options = {})
16
16
  self.secret = options[:secret] || Config.api_secret
17
- self.widget_options = options[:widget] || widget_options_from_config
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
20
  end
@@ -62,15 +62,15 @@ module IntercomRails
62
62
  @user_details = @user_details.with_indifferent_access.tap do |u|
63
63
  [:email, :name, :user_id].each { |k| u.delete(k) if u[k].nil? }
64
64
 
65
- u[:user_hash] ||= user_hash if secret.present?
65
+ u[:user_hash] ||= user_hash if secret.present? && (u[:user_id] || u[:email]).present?
66
66
  u[:app_id] ||= app_id
67
67
  end
68
68
  end
69
69
 
70
70
  def find_current_user_details
71
71
  return {} unless controller.present?
72
- CurrentUser.locate_and_prepare_for_intercom(controller)
73
- rescue CurrentUserNotFoundError
72
+ UserProxy.from_current_user_in_object(controller).to_hash
73
+ rescue NoUserFoundError
74
74
  {}
75
75
  end
76
76
 
@@ -88,16 +88,21 @@ module IntercomRails
88
88
  end
89
89
 
90
90
  def widget_options_from_config
91
- return nil unless Config.inbox
91
+ config = {}
92
92
 
93
- activator = case Config.inbox
93
+ activator = case Config.inbox.style
94
94
  when :default
95
95
  '#IntercomDefaultWidget'
96
96
  when :custom
97
97
  '#Intercom'
98
+ else
99
+ nil
98
100
  end
99
101
 
100
- {:activator => activator}
102
+ config[:activator] = activator if activator
103
+ config[:use_counter] = Config.inbox.counter if Config.inbox.counter
104
+
105
+ config
101
106
  end
102
107
 
103
108
  def convert_dates_to_unix_timestamps(object)
@@ -0,0 +1,83 @@
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 true if user.respond_to?(:id) && user.id.present?
51
+ return true if user.respond_to?(:email) && user.email.present?
52
+ false
53
+ end
54
+
55
+ private
56
+ def attribute_present?(attribute)
57
+ user.respond_to?(attribute) && user.send(attribute).present?
58
+ end
59
+
60
+ def custom_data_value_from_proc_or_symbol(proc_or_symbol)
61
+ if proc_or_symbol.kind_of?(Symbol)
62
+ user.send(proc_or_symbol)
63
+ elsif proc_or_symbol.kind_of?(Proc)
64
+ proc_or_symbol.call(user)
65
+ end
66
+ end
67
+
68
+ def custom_data_from_request
69
+ search_object.intercom_custom_data
70
+ rescue NoMethodError
71
+ {}
72
+ end
73
+
74
+ def custom_data_from_config
75
+ return {} if Config.custom_data.blank?
76
+ Config.custom_data.reduce({}) do |custom_data, (k,v)|
77
+ custom_data.merge(k => custom_data_value_from_proc_or_symbol(v))
78
+ end
79
+ end
80
+
81
+ end
82
+
83
+ end
@@ -1,3 +1,3 @@
1
1
  module IntercomRails
2
- VERSION = "0.0.9"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -33,15 +33,32 @@ IntercomRails.config do |config|
33
33
  # The class which defines your user model
34
34
  #
35
35
  # config.user_model = Proc.new { User }
36
+
37
+ # == Custom Data
38
+ # A hash of additional data you wish to send about your users.
39
+ # You can provide either a method name which will be sent to the current
40
+ # user object, or a Proc which will be passed the current user.
41
+ #
42
+ # config.custom_data = {
43
+ # 'plan' => Proc.new { |current_user| current_user.plan.name },
44
+ # 'favorite_color' => :favorite_color
45
+ # }
36
46
 
37
- # == Inbox
47
+ # == Inbox Style
38
48
  # This enables the Intercom inbox which allows your users to read their
39
- # past conversations with your app, as well as start new ones.
49
+ # past conversations with your app, as well as start new ones. It is
50
+ # disabled by default.
40
51
  # * :default shows a small tab with a question mark icon on it
41
52
  # * :custom attaches the inbox open event to an anchor with an
42
53
  # id of #Intercom.
43
54
  #
44
- # config.inbox = :default
45
- # config.inbox = :custom
55
+ # config.inbox.style = :default
56
+ # config.inbox.style = :custom
57
+
58
+ # == Inbox Counter
59
+ # If you're using the custom inbox style, you can request that Intercom
60
+ # insert an `em` element into your anchor with the count of unread messages
61
+ #
62
+ # config.inbox.counter = true
46
63
 
47
64
  end
@@ -10,6 +10,7 @@ end
10
10
 
11
11
  class ActionController::Base
12
12
 
13
+ include IntercomRails::CustomDataHelper
13
14
  after_filter IntercomRails::AutoIncludeFilter
14
15
 
15
16
  include TestRoutes.url_helpers
@@ -10,6 +10,12 @@ 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_instance_variable_and_custom_data
15
+ @user = dummy_user
16
+ intercom_custom_data['testing_stuff'] = true
17
+ render :text => params[:body], :content_type => 'text/html'
18
+ end
13
19
 
14
20
  def with_unusable_user_instance_variable
15
21
  @user = Object.new
@@ -34,12 +40,18 @@ end
34
40
 
35
41
  class AutoIncludeFilterTest < ActionController::TestCase
36
42
 
43
+ include InterTest
44
+
37
45
  tests TestController
38
46
 
39
47
  def setup
40
48
  super
41
49
  ENV['INTERCOM_APP_ID'] = 'my_app_id'
42
50
  end
51
+
52
+ def teardown
53
+ ENV.delete('INTERCOM_APP_ID')
54
+ end
43
55
 
44
56
  def test_no_user_present
45
57
  get :without_user, :body => "<body>Hello world</body>"
@@ -65,6 +77,13 @@ class AutoIncludeFilterTest < ActionController::TestCase
65
77
  assert_includes @response.body, "Ben McRedmond"
66
78
  end
67
79
 
80
+ def test_user_instance_variable_present_with_body_tag_and_custom_data
81
+ get :with_user_instance_variable_and_custom_data, :body => "<body>Hello world</body>"
82
+ assert_includes @response.body, "<script>"
83
+ assert_includes @response.body, "custom_data"
84
+ assert_includes @response.body, "testing_stuff"
85
+ end
86
+
68
87
  def test_current_user_method_present_with_body_tag
69
88
  get :with_current_user_method, :body => "<body>Hello world</body>"
70
89
 
@@ -2,6 +2,8 @@ require 'test_setup'
2
2
 
3
3
  class ConfigTest < MiniTest::Unit::TestCase
4
4
 
5
+ include InterTest
6
+
5
7
  def test_setting_app_id
6
8
  IntercomRails.config.app_id = "1234"
7
9
  assert_equal IntercomRails.config.app_id, "1234"
@@ -27,4 +29,37 @@ class ConfigTest < MiniTest::Unit::TestCase
27
29
  assert_equal IntercomRails.config.app_id, "4567"
28
30
  end
29
31
 
32
+ def test_custom_data_rejects_non_proc_or_symbol_attributes
33
+ exception = assert_raises ArgumentError do
34
+ IntercomRails.config.custom_data = {
35
+ 'foo' => Proc.new {},
36
+ 'bar' => 'heyheyhey!'
37
+ }
38
+ end
39
+
40
+ assert_equal "all custom_data attributes should be either a Proc or a symbol", exception.message
41
+ end
42
+
43
+ def test_setting_custom_data
44
+ custom_data_config = {
45
+ 'foo' => Proc.new {},
46
+ 'bar' => :method_name
47
+ }
48
+
49
+ IntercomRails.config.custom_data = custom_data_config
50
+ assert_equal custom_data_config, IntercomRails.config.custom_data
51
+ end
52
+
53
+ def test_reset_clears_existing_config
54
+ IntercomRails.config.custom_data = {'muffin' => :muffin}
55
+ IntercomRails.config.reset!
56
+ assert_equal nil, IntercomRails.config.custom_data
57
+ end
58
+
59
+ def test_reset_clears_inbox_config_too
60
+ IntercomRails.config.inbox.style = :custom
61
+ IntercomRails.config.reset!
62
+ assert_equal nil, IntercomRails.config.inbox.style
63
+ end
64
+
30
65
  end
@@ -72,6 +72,7 @@ end
72
72
 
73
73
  class ImportNetworkTest < InterRunner::TestCase
74
74
 
75
+ include InterTest
75
76
  include ImportTest
76
77
 
77
78
  def api_path=(path)
@@ -2,6 +2,7 @@ require 'import_test_setup'
2
2
 
3
3
  class ImportUnitTest < MiniTest::Unit::TestCase
4
4
 
5
+ include InterTest
5
6
  include ImportTest
6
7
 
7
8
  def test_run_with_wrong_rails_env
@@ -44,29 +45,6 @@ class ImportUnitTest < MiniTest::Unit::TestCase
44
45
  assert_equal exception.message, "Please add an Intercom API Key to config/initializers/intercom.rb"
45
46
  end
46
47
 
47
- def test_user_for_wire_returns_nil_if_no_user_id_or_email
48
- user = Object.new
49
- user.instance_eval do
50
- def name
51
- "Ben"
52
- end
53
- end
54
-
55
- hsh = IntercomRails::Import.new.send(:user_for_wire, user)
56
- assert_equal hsh, nil
57
- end
58
-
59
- def test_user_for_wire_returns_hash_if_user_id_or_email
60
- hsh = IntercomRails::Import.new.send(:user_for_wire, User.first)
61
- assert_equal({:user_id => 1, :email => "ben@intercom.io", :name => "Ben McRedmond"}, hsh)
62
- end
63
-
64
- def test_send_users_in_batches_prepares_users_for_wire
65
- expected_batch = {:users => User.all.map { |u| IntercomRails::Import.new.send(:user_for_wire, u) }}.to_json
66
- IntercomRails::Import.any_instance.should_receive(:send_users).with(expected_batch).and_return({'failed' => []})
67
- IntercomRails::Import.run
68
- end
69
-
70
48
  def test_status_output
71
49
  @import = IntercomRails::Import.new(:status_enabled => true)
72
50
  @import.stub(:send_users).and_return('failed' => [1])
@@ -3,8 +3,14 @@ require 'test_setup'
3
3
 
4
4
  class ScriptTagTest < MiniTest::Unit::TestCase
5
5
 
6
+ include InterTest
6
7
  include IntercomRails
7
8
 
9
+ def setup
10
+ super
11
+ IntercomRails.config.app_id = 'script_tag_test'
12
+ end
13
+
8
14
  def test_output_is_html_safe?
9
15
  assert_equal true, ScriptTag.generate({}).html_safe?
10
16
  end
@@ -59,4 +65,27 @@ class ScriptTagTest < MiniTest::Unit::TestCase
59
65
  assert_equal Digest::SHA1.hexdigest('1234' + 'ben@intercom.io'), script_tag.intercom_settings[:user_hash]
60
66
  end
61
67
 
68
+ def test_inbox_default_style
69
+ IntercomRails.config.inbox.style = :default
70
+ script_tag = ScriptTag.new
71
+ expected_widget_settings= {'activator' => '#IntercomDefaultWidget'}
72
+ assert_equal expected_widget_settings, script_tag.intercom_settings['widget']
73
+ end
74
+
75
+ def test_inbox_custom_style
76
+ IntercomRails.config.inbox.style = :custom
77
+ script_tag = ScriptTag.new
78
+ expected_widget_settings = {'activator' => '#Intercom'}
79
+ assert_equal expected_widget_settings, script_tag.intercom_settings['widget']
80
+ end
81
+
82
+ def test_inbox_custom_style_with_counter
83
+ IntercomRails.config.inbox.style = :custom
84
+ IntercomRails.config.inbox.counter = true
85
+ script_tag = ScriptTag.new
86
+ expected_widget_settings = {'activator' => '#Intercom', 'use_counter' => true}
87
+ assert_equal expected_widget_settings, script_tag.intercom_settings['widget']
88
+ end
89
+
90
+
62
91
  end
@@ -0,0 +1,89 @@
1
+ require 'test_setup'
2
+
3
+ class UserProxyTest < MiniTest::Unit::TestCase
4
+
5
+ include InterTest
6
+ include IntercomRails
7
+
8
+ DUMMY_USER = dummy_user(:email => 'ciaran@intercom.io', :name => 'Ciaran Lee')
9
+
10
+ def test_raises_error_when_no_user_found
11
+ assert_raises(IntercomRails::NoUserFoundError) {
12
+ UserProxy.from_current_user_in_object(Object.new)
13
+ }
14
+ end
15
+
16
+ def test_finds_current_user
17
+ object_with_current_user_method = Object.new
18
+ object_with_current_user_method.instance_eval do
19
+ def current_user
20
+ DUMMY_USER
21
+ end
22
+ end
23
+
24
+ @user_proxy = UserProxy.from_current_user_in_object(object_with_current_user_method)
25
+ assert_user_found
26
+ end
27
+
28
+ def test_finds_user_instance_variable
29
+ object_with_instance_variable = Object.new
30
+ object_with_instance_variable.instance_eval do
31
+ @user = DUMMY_USER
32
+ end
33
+
34
+ @user_proxy = UserProxy.from_current_user_in_object(object_with_instance_variable)
35
+ assert_user_found
36
+ end
37
+
38
+ def test_finds_config_user
39
+ object_from_config = Object.new
40
+ object_from_config.instance_eval do
41
+ def something_esoteric
42
+ DUMMY_USER
43
+ end
44
+ end
45
+
46
+ IntercomRails.config.current_user = Proc.new { something_esoteric }
47
+ @user_proxy = UserProxy.from_current_user_in_object(object_from_config)
48
+ assert_user_found
49
+ end
50
+
51
+ def assert_user_found
52
+ assert_equal DUMMY_USER, @user_proxy.user
53
+ end
54
+
55
+ def test_includes_custom_data
56
+ plan_dummy_user = DUMMY_USER.dup
57
+ plan_dummy_user.instance_eval do
58
+ def plan
59
+ 'pro'
60
+ end
61
+ end
62
+
63
+ IntercomRails.config.custom_data = {
64
+ 'plan' => :plan
65
+ }
66
+
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]
70
+ end
71
+
72
+ def test_valid_returns_true_if_user_id_or_email
73
+ assert_equal true, UserProxy.new(DUMMY_USER).valid?
74
+ end
75
+
76
+ def test_includes_custom_data_from_intercom_custom_data
77
+ object_with_intercom_custom_data = Object.new
78
+ object_with_intercom_custom_data.instance_eval do
79
+ def intercom_custom_data
80
+ {:ponies => :rainbows}
81
+ end
82
+ end
83
+
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]
87
+ end
88
+
89
+ end
@@ -33,3 +33,12 @@ class Object
33
33
  end
34
34
 
35
35
  RSpec::Mocks::setup(Object.new)
36
+
37
+ module InterTest
38
+
39
+ def setup
40
+ IntercomRails::Config.reset!
41
+ super
42
+ end
43
+
44
+ end
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.0.9
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-11-22 00:00:00.000000000 Z
14
+ date: 2012-11-23 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activesupport
@@ -139,13 +139,14 @@ files:
139
139
  - lib/data/cacert.pem
140
140
  - lib/intercom-rails/auto_include_filter.rb
141
141
  - lib/intercom-rails/config.rb
142
- - lib/intercom-rails/current_user.rb
142
+ - lib/intercom-rails/custom_data_helper.rb
143
143
  - lib/intercom-rails/exceptions.rb
144
144
  - lib/intercom-rails/import.rb
145
145
  - lib/intercom-rails/intercom.rake
146
146
  - lib/intercom-rails/railtie.rb
147
147
  - lib/intercom-rails/script_tag.rb
148
148
  - lib/intercom-rails/script_tag_helper.rb
149
+ - lib/intercom-rails/user_proxy.rb
149
150
  - lib/intercom-rails/version.rb
150
151
  - lib/intercom-rails.rb
151
152
  - lib/rails/generators/intercom/config/config_generator.rb
@@ -157,11 +158,11 @@ files:
157
158
  - test/import_test_setup.rb
158
159
  - test/intercom-rails/auto_include_filter_test.rb
159
160
  - test/intercom-rails/config_test.rb
160
- - test/intercom-rails/current_user_test.rb
161
161
  - test/intercom-rails/import_network_test.rb
162
162
  - test/intercom-rails/import_unit_test.rb
163
163
  - test/intercom-rails/script_tag_helper_test.rb
164
164
  - test/intercom-rails/script_tag_test.rb
165
+ - test/intercom-rails/user_proxy_test.rb
165
166
  - test/test_setup.rb
166
167
  homepage: http://www.intercom.io
167
168
  licenses: []
@@ -177,7 +178,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
177
178
  version: '0'
178
179
  segments:
179
180
  - 0
180
- hash: 1999589509538481455
181
+ hash: -888650267996425080
181
182
  required_rubygems_version: !ruby/object:Gem::Requirement
182
183
  none: false
183
184
  requirements:
@@ -186,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
187
  version: '0'
187
188
  segments:
188
189
  - 0
189
- hash: 1999589509538481455
190
+ hash: -888650267996425080
190
191
  requirements: []
191
192
  rubyforge_project: intercom-rails
192
193
  rubygems_version: 1.8.23
@@ -198,9 +199,9 @@ test_files:
198
199
  - test/import_test_setup.rb
199
200
  - test/intercom-rails/auto_include_filter_test.rb
200
201
  - test/intercom-rails/config_test.rb
201
- - test/intercom-rails/current_user_test.rb
202
202
  - test/intercom-rails/import_network_test.rb
203
203
  - test/intercom-rails/import_unit_test.rb
204
204
  - test/intercom-rails/script_tag_helper_test.rb
205
205
  - test/intercom-rails/script_tag_test.rb
206
+ - test/intercom-rails/user_proxy_test.rb
206
207
  - test/test_setup.rb
@@ -1,53 +0,0 @@
1
- module IntercomRails
2
-
3
- class CurrentUser
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.locate_and_prepare_for_intercom(*args)
12
- new(*args).to_hash
13
- end
14
-
15
- attr_reader :search_object, :user
16
-
17
- def initialize(search_object)
18
- @search_object = search_object
19
- @user = find_user
20
- end
21
-
22
- def find_user
23
- POTENTIAL_USER_OBJECTS.each do |potential_user|
24
- begin
25
- user = search_object.instance_eval &potential_user
26
- return user if user.present? &&
27
- (user.email.present? || user.id.present?)
28
- rescue NameError
29
- next
30
- end
31
- end
32
-
33
- raise CurrentUserNotFoundError
34
- end
35
-
36
- def to_hash
37
- hsh = {}
38
- hsh[:user_id] = user.id if attribute_present?(:id)
39
- [:email, :name, :created_at].each do |attribute|
40
- hsh[attribute] = user.send(attribute) if attribute_present?(attribute)
41
- end
42
-
43
- hsh
44
- end
45
-
46
- private
47
- def attribute_present?(attribute)
48
- user.respond_to?(attribute) && user.send(attribute).present?
49
- end
50
-
51
- end
52
-
53
- end
@@ -1,54 +0,0 @@
1
- require 'test_setup'
2
-
3
- class CurrentUserTest < MiniTest::Unit::TestCase
4
-
5
- include IntercomRails
6
-
7
- DUMMY_USER = dummy_user(:email => 'ciaran@intercom.io', :name => 'Ciaran Lee')
8
-
9
- def test_raises_error_when_no_user_found
10
- assert_raises(IntercomRails::CurrentUserNotFoundError) {
11
- CurrentUser.new(Object.new)
12
- }
13
- end
14
-
15
- def test_finds_current_user
16
- object_with_current_user_method = Object.new
17
- object_with_current_user_method.instance_eval do
18
- def current_user
19
- DUMMY_USER
20
- end
21
- end
22
-
23
- @current_user = CurrentUser.new(object_with_current_user_method)
24
- assert_user_found
25
- end
26
-
27
- def test_finds_user_instance_variable
28
- object_with_instance_variable = Object.new
29
- object_with_instance_variable.instance_eval do
30
- @user = DUMMY_USER
31
- end
32
-
33
- @current_user = CurrentUser.new(object_with_instance_variable)
34
- assert_user_found
35
- end
36
-
37
- def test_finds_config_user
38
- object_from_config = Object.new
39
- object_from_config.instance_eval do
40
- def something_esoteric
41
- DUMMY_USER
42
- end
43
- end
44
-
45
- IntercomRails.config.current_user = Proc.new { something_esoteric }
46
- @current_user = CurrentUser.new(object_from_config)
47
- assert_user_found
48
- end
49
-
50
- def assert_user_found
51
- assert_equal DUMMY_USER, @current_user.user
52
- end
53
-
54
- end