sugarcrm_emp 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +29 -0
- data/Gemfile +14 -0
- data/LICENSE +20 -0
- data/README.rdoc +275 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/WATCHLIST.rdoc +7 -0
- data/bin/sugarcrm +26 -0
- data/lib/rails/generators/sugarcrm/config/config_generator.rb +22 -0
- data/lib/rails/generators/sugarcrm/config/templates/initializer.rb +4 -0
- data/lib/rails/generators/sugarcrm/config/templates/sugarcrm.yml +19 -0
- data/lib/sugarcrm/associations/association.rb +170 -0
- data/lib/sugarcrm/associations/association_cache.rb +36 -0
- data/lib/sugarcrm/associations/association_collection.rb +141 -0
- data/lib/sugarcrm/associations/association_methods.rb +91 -0
- data/lib/sugarcrm/associations/associations.rb +61 -0
- data/lib/sugarcrm/associations.rb +5 -0
- data/lib/sugarcrm/attributes/attribute_methods.rb +203 -0
- data/lib/sugarcrm/attributes/attribute_serializers.rb +55 -0
- data/lib/sugarcrm/attributes/attribute_typecast.rb +44 -0
- data/lib/sugarcrm/attributes/attribute_validations.rb +62 -0
- data/lib/sugarcrm/attributes.rb +4 -0
- data/lib/sugarcrm/base.rb +355 -0
- data/lib/sugarcrm/config/sugarcrm.yaml +10 -0
- data/lib/sugarcrm/connection/api/get_available_modules.rb +22 -0
- data/lib/sugarcrm/connection/api/get_document_revision.rb +14 -0
- data/lib/sugarcrm/connection/api/get_entries.rb +23 -0
- data/lib/sugarcrm/connection/api/get_entries_count.rb +20 -0
- data/lib/sugarcrm/connection/api/get_entry.rb +23 -0
- data/lib/sugarcrm/connection/api/get_entry_list.rb +31 -0
- data/lib/sugarcrm/connection/api/get_module_fields.rb +15 -0
- data/lib/sugarcrm/connection/api/get_note_attachment.rb +14 -0
- data/lib/sugarcrm/connection/api/get_relationships.rb +30 -0
- data/lib/sugarcrm/connection/api/get_report_entries.rb +17 -0
- data/lib/sugarcrm/connection/api/get_server_info.rb +7 -0
- data/lib/sugarcrm/connection/api/get_user_id.rb +13 -0
- data/lib/sugarcrm/connection/api/get_user_team_id.rb +14 -0
- data/lib/sugarcrm/connection/api/login.rb +18 -0
- data/lib/sugarcrm/connection/api/logout.rb +15 -0
- data/lib/sugarcrm/connection/api/seamless_login.rb +13 -0
- data/lib/sugarcrm/connection/api/search_by_module.rb +25 -0
- data/lib/sugarcrm/connection/api/set_campaign_merge.rb +15 -0
- data/lib/sugarcrm/connection/api/set_document_revision.rb +35 -0
- data/lib/sugarcrm/connection/api/set_entries.rb +15 -0
- data/lib/sugarcrm/connection/api/set_entry.rb +15 -0
- data/lib/sugarcrm/connection/api/set_note_attachment.rb +25 -0
- data/lib/sugarcrm/connection/api/set_relationship.rb +27 -0
- data/lib/sugarcrm/connection/api/set_relationships.rb +22 -0
- data/lib/sugarcrm/connection/connection.rb +201 -0
- data/lib/sugarcrm/connection/helper.rb +50 -0
- data/lib/sugarcrm/connection/request.rb +61 -0
- data/lib/sugarcrm/connection/response.rb +91 -0
- data/lib/sugarcrm/connection.rb +5 -0
- data/lib/sugarcrm/connection_pool.rb +163 -0
- data/lib/sugarcrm/exceptions.rb +23 -0
- data/lib/sugarcrm/extensions/README.txt +23 -0
- data/lib/sugarcrm/finders/dynamic_finder_match.rb +41 -0
- data/lib/sugarcrm/finders/finder_methods.rb +243 -0
- data/lib/sugarcrm/finders.rb +2 -0
- data/lib/sugarcrm/module.rb +174 -0
- data/lib/sugarcrm/module_methods.rb +91 -0
- data/lib/sugarcrm/session.rb +218 -0
- data/lib/sugarcrm.rb +22 -0
- data/sugarcrm.gemspec +178 -0
- data/test/config_test.yaml +15 -0
- data/test/connection/test_get_available_modules.rb +9 -0
- data/test/connection/test_get_entries.rb +15 -0
- data/test/connection/test_get_entry.rb +22 -0
- data/test/connection/test_get_entry_list.rb +23 -0
- data/test/connection/test_get_module_fields.rb +11 -0
- data/test/connection/test_get_relationships.rb +12 -0
- data/test/connection/test_get_server_info.rb +9 -0
- data/test/connection/test_get_user_id.rb +9 -0
- data/test/connection/test_get_user_team_id.rb +9 -0
- data/test/connection/test_login.rb +9 -0
- data/test/connection/test_logout.rb +9 -0
- data/test/connection/test_set_document_revision.rb +28 -0
- data/test/connection/test_set_entry.rb +15 -0
- data/test/connection/test_set_note_attachment.rb +16 -0
- data/test/connection/test_set_relationship.rb +18 -0
- data/test/extensions_test/patch.rb +9 -0
- data/test/helper.rb +17 -0
- data/test/test_association_collection.rb +11 -0
- data/test/test_associations.rb +156 -0
- data/test/test_connection.rb +13 -0
- data/test/test_connection_pool.rb +40 -0
- data/test/test_finders.rb +201 -0
- data/test/test_module.rb +51 -0
- data/test/test_request.rb +35 -0
- data/test/test_response.rb +26 -0
- data/test/test_session.rb +136 -0
- data/test/test_sugarcrm.rb +213 -0
- metadata +266 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestSetDocumentRevision < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
should "Update a document revision" do
|
6
|
+
file = File.read("test/config_test.yaml")
|
7
|
+
# Create a new document, no file is attached or uploaded at this stage.
|
8
|
+
d = SugarCRM::Document.create(
|
9
|
+
:revision => 1,
|
10
|
+
:active_date => Date.today,
|
11
|
+
:filename => "config_test.yaml",
|
12
|
+
:document_name=> "config_test.yaml",
|
13
|
+
:uploadfile => "config_test.yaml"
|
14
|
+
)
|
15
|
+
# Did we succeed?
|
16
|
+
assert !d.new?
|
17
|
+
# Create a new document revision, attaching the file to the document_revision, and associating the document
|
18
|
+
# revision with parent document
|
19
|
+
assert SugarCRM.connection.set_document_revision(d.id, d.revision + 1, {:file => file, :file_name => "config_test.yaml"})
|
20
|
+
# Delete the document
|
21
|
+
assert d.delete
|
22
|
+
# Remove any document revisions associated with that document
|
23
|
+
SugarCRM::DocumentRevision.find_all_by_document_id(d.id).each do |dr|
|
24
|
+
assert dr.delete
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestSetEntry < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
should "set values on an Bean with #set_entry" do
|
6
|
+
|
7
|
+
name_value_list = {
|
8
|
+
"name" => { "name" => "name", "value" => "A Test Meeting" },
|
9
|
+
"date_start" => { "name" => "date_start", "value" => "2011-11-23 12:03:16" },
|
10
|
+
"description" => { "name" => "description", "value" => "RT @bumblebeenie "It's Childish Gambino, home girl drop it like the Nasdaq" Are you serious bro?" }
|
11
|
+
}
|
12
|
+
meeting = SugarCRM.connection.set_entry("Meetings", name_value_list)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestSetNoteAttachment < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
should "Add an attachment to a Note" do
|
6
|
+
n = SugarCRM::Note.new
|
7
|
+
n.name = "A Test Note"
|
8
|
+
assert n.save
|
9
|
+
file = File.read("test/config_test.yaml")
|
10
|
+
assert SugarCRM.connection.set_note_attachment(n.id, "config_test.yaml", file)
|
11
|
+
attachment = SugarCRM.connection.get_note_attachment(n.id)
|
12
|
+
assert_equal file, Base64.decode64(attachment["file"])
|
13
|
+
assert n.delete
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestSetRelationship < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM.connection" do
|
5
|
+
should "add and remove a relationship when #set_relationship" do
|
6
|
+
meeting = SugarCRM::Meeting.new
|
7
|
+
meeting.date_start = DateTime.now
|
8
|
+
meeting.duration_hours = 0.5
|
9
|
+
meeting.name = "Stupid Meeting"
|
10
|
+
assert meeting.save!
|
11
|
+
response = SugarCRM.connection.set_relationship("Users","1","meetings", [meeting.id])
|
12
|
+
assert response["created"] == 1
|
13
|
+
response = SugarCRM.connection.set_relationship("Users","1","meetings", [meeting.id], {:delete => 1})
|
14
|
+
assert response["deleted"] == 1
|
15
|
+
assert meeting.delete
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'shoulda'
|
4
|
+
require 'active_support/test_case'
|
5
|
+
|
6
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
8
|
+
require 'sugarcrm'
|
9
|
+
|
10
|
+
CONFIG_PATH = File.join(File.dirname(__FILE__),'config.yaml')
|
11
|
+
|
12
|
+
class ActiveSupport::TestCase
|
13
|
+
# put your credentials into a YAML file in the test directory
|
14
|
+
# the format should be identical to the config_test.yaml found in the same directory
|
15
|
+
raise "test/config.yaml file not found. See README for instructions on setting up a testing environment" unless File.exists? CONFIG_PATH
|
16
|
+
SugarCRM::Session.from_file(CONFIG_PATH)
|
17
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestAssociationCollection < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM::AssociationCollection instance" do
|
5
|
+
should "create a new instance when #new" do
|
6
|
+
u = SugarCRM::User.find("seed_sarah_id")
|
7
|
+
ac = SugarCRM::AssociationCollection.new(u,:email_addresses)
|
8
|
+
assert_instance_of SugarCRM::AssociationCollection, ac
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestAssociations < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM::Associations class" do
|
5
|
+
should "Return an array of Association objects when self#register(SugarCRM::User.new)" do
|
6
|
+
associations = SugarCRM::Associations.register(SugarCRM::User.new)
|
7
|
+
assert associations.include? "email_addresses"
|
8
|
+
assert associations.proxy_methods.include? "email_addresses"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "A SugarCRM::Association class" do
|
13
|
+
should "compute relationship cardinality correctly" do
|
14
|
+
c = SugarCRM::Case.first
|
15
|
+
link_fields_hash = c.associations.classify{|i| i.link_field}
|
16
|
+
# TODO: test one_to_one cardinality by creating custom module with custom relationship
|
17
|
+
# (no "official" one-to-one relationship exists in Sugar out of the box)
|
18
|
+
assert_equal :one_to_many, link_fields_hash['calls'].first.cardinality
|
19
|
+
assert_equal :many_to_one, link_fields_hash['accounts'].first.cardinality
|
20
|
+
assert_equal :many_to_many, link_fields_hash['contacts'].first.cardinality
|
21
|
+
end
|
22
|
+
should "respond to #pretty_print" do
|
23
|
+
a = SugarCRM::Case.first.associations.first
|
24
|
+
assert_respond_to a, :pretty_print
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "A SugarCRM::Base instance" do
|
29
|
+
should "return an email address when sent #email_addresses" do
|
30
|
+
u = SugarCRM::User.find("seed_sarah_id")
|
31
|
+
assert_instance_of SugarCRM::AssociationCollection, u.email_addresses
|
32
|
+
assert_instance_of SugarCRM::EmailAddress, u.email_addresses.first
|
33
|
+
assert_equal "sarah@example.com", u.email_addresses.first.email_address
|
34
|
+
end
|
35
|
+
|
36
|
+
should "utilize the association cache" do
|
37
|
+
u = SugarCRM::User.find(1)
|
38
|
+
u.email_addresses
|
39
|
+
assert u.association_cached? :email_addresses
|
40
|
+
end
|
41
|
+
|
42
|
+
should "permit adding a record to an association collection (such as #meetings << Meeting.new)" do
|
43
|
+
u = SugarCRM::User.find(1)
|
44
|
+
m = SugarCRM::Meeting.new
|
45
|
+
m.date_start = DateTime.now
|
46
|
+
m.duration_hours = 0.5
|
47
|
+
m.name = "Yet Another Stupid Meeting"
|
48
|
+
u.meetings << m
|
49
|
+
assert u.meetings.include?(m)
|
50
|
+
assert_equal [m], u.meetings.added
|
51
|
+
assert u.save!
|
52
|
+
u = SugarCRM::User.find(1)
|
53
|
+
assert u.meetings.include?(m)
|
54
|
+
assert u.meetings.delete(m)
|
55
|
+
assert u.meetings.save!
|
56
|
+
assert !u.meetings.include?(m)
|
57
|
+
end
|
58
|
+
|
59
|
+
# TODO: Fix created_by_link to only return a single result
|
60
|
+
should "return a user when sent #created_by_link" do
|
61
|
+
a = SugarCRM::Account.first
|
62
|
+
assert_instance_of SugarCRM::User, a.created_by_link.first
|
63
|
+
end
|
64
|
+
|
65
|
+
should "create relationships with associate!" do
|
66
|
+
a = SugarCRM::Account.first
|
67
|
+
c = SugarCRM::Contact.create(:last_name => 'Doe')
|
68
|
+
|
69
|
+
nb_contacts = a.contacts.size
|
70
|
+
a.associate!(c)
|
71
|
+
assert_equal nb_contacts + 1, a.contacts.size # test association_cache is updated
|
72
|
+
|
73
|
+
assert_equal nb_contacts + 1, SugarCRM::Account.first.contacts.size # test relationship is created in Sugar
|
74
|
+
|
75
|
+
assert c.delete
|
76
|
+
end
|
77
|
+
|
78
|
+
should "destroy relationships with disassociate!" do
|
79
|
+
a = SugarCRM::Account.first
|
80
|
+
c = SugarCRM::Contact.create(:last_name => 'Doe')
|
81
|
+
|
82
|
+
a.associate!(c)
|
83
|
+
nb_contacts = a.contacts.size
|
84
|
+
a.disassociate!(c)
|
85
|
+
assert_equal nb_contacts - 1, a.contacts.size # test association_cache is updated
|
86
|
+
|
87
|
+
assert_equal nb_contacts - 1, SugarCRM::Account.first.contacts.size # test relationship is destroyed in Sugar
|
88
|
+
|
89
|
+
assert c.delete
|
90
|
+
end
|
91
|
+
|
92
|
+
should "not destroy a relationship if associate! is called with {:delete => 0}" do
|
93
|
+
a = SugarCRM::Account.first
|
94
|
+
c = SugarCRM::Contact.create(:last_name => 'Doe')
|
95
|
+
|
96
|
+
a.associate!(c)
|
97
|
+
nb_contacts = a.contacts.size
|
98
|
+
a.associate!(c, {:delete => 0})
|
99
|
+
assert_equal nb_contacts, a.contacts.size
|
100
|
+
|
101
|
+
assert c.delete
|
102
|
+
end
|
103
|
+
|
104
|
+
should "update association cache on associate! only if association changes" do
|
105
|
+
a = SugarCRM::Account.first
|
106
|
+
c = SugarCRM::Contact.create(:last_name => 'Doe')
|
107
|
+
|
108
|
+
nb_contacts = a.contacts.size
|
109
|
+
a.associate!(c)
|
110
|
+
assert_equal nb_contacts + 1, a.contacts.size
|
111
|
+
a.associate!(c)
|
112
|
+
assert_equal nb_contacts + 1, a.contacts.size # should not change: already associated
|
113
|
+
|
114
|
+
assert c.delete
|
115
|
+
end
|
116
|
+
|
117
|
+
should "update association cache on << only if association changes" do
|
118
|
+
a = SugarCRM::Account.first
|
119
|
+
c = SugarCRM::Contact.create(:last_name => 'Doe')
|
120
|
+
|
121
|
+
nb_contacts = a.contacts.size
|
122
|
+
a.contacts << c
|
123
|
+
assert_equal nb_contacts + 1, a.contacts.size
|
124
|
+
a.contacts << c
|
125
|
+
assert_equal nb_contacts + 1, a.contacts.size # should not change: already associated
|
126
|
+
|
127
|
+
assert c.delete
|
128
|
+
end
|
129
|
+
|
130
|
+
should "update association cache for both sides of the relationship when calling associate!" do
|
131
|
+
a = SugarCRM::Account.first
|
132
|
+
c = SugarCRM::Contact.create(:last_name => 'Doe')
|
133
|
+
|
134
|
+
nb_contacts = a.contacts.size
|
135
|
+
nb_accounts = c.accounts.size
|
136
|
+
a.associate!(c)
|
137
|
+
assert_equal nb_contacts + 1, a.contacts.size
|
138
|
+
assert_equal nb_accounts + 1, c.accounts.size
|
139
|
+
|
140
|
+
assert c.delete
|
141
|
+
end
|
142
|
+
|
143
|
+
should "update association cache for both sides of the relationship when calling <<" do
|
144
|
+
a = SugarCRM::Account.first
|
145
|
+
c = SugarCRM::Contact.create(:last_name => 'Doe')
|
146
|
+
|
147
|
+
nb_contacts = a.contacts.size
|
148
|
+
nb_accounts = c.accounts.size
|
149
|
+
a.contacts << c
|
150
|
+
assert_equal nb_contacts + 1, a.contacts.size
|
151
|
+
assert_equal nb_accounts + 1, c.accounts.size
|
152
|
+
|
153
|
+
assert c.delete
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestConnection < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM::Connection instance" do
|
5
|
+
should "retrieve the list of available modules" do
|
6
|
+
assert_instance_of Array, SugarCRM.modules
|
7
|
+
assert_instance_of SugarCRM::Module, SugarCRM.modules[0]
|
8
|
+
end
|
9
|
+
should "create sub-classes by module name" do
|
10
|
+
assert SugarCRM.session.namespace_const.const_defined? "User"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestConnectionPool < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM::ConnectionPool instance" do
|
5
|
+
should "have a default pool size of 1 if Rails isn't defined" do
|
6
|
+
assert_equal 1, SugarCRM.session.connection_pool.size
|
7
|
+
end
|
8
|
+
|
9
|
+
should "be able to specify its pool size" do
|
10
|
+
config = SugarCRM.session.config
|
11
|
+
sess = SugarCRM::Session.new(config[:base_url], config[:username], config[:password], {:connection_pool => {:size => 3}})
|
12
|
+
|
13
|
+
begin
|
14
|
+
assert_equal 3, sess.connection_pool.size
|
15
|
+
ensure
|
16
|
+
sess.disconnect!
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
should "be able to specify its timeout on creation" do
|
21
|
+
default_timeout = SugarCRM.session.connection_pool.timeout
|
22
|
+
|
23
|
+
config = SugarCRM.session.config
|
24
|
+
sess = SugarCRM::Session.new(config[:base_url], config[:username], config[:password], {:connection_pool => {:wait_timeout => default_timeout+1}})
|
25
|
+
|
26
|
+
begin
|
27
|
+
assert_equal default_timeout+1, sess.connection_pool.timeout
|
28
|
+
ensure
|
29
|
+
sess.disconnect!
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
should "be able to specify its timeout after creation" do
|
34
|
+
timeout = SugarCRM.session.connection_pool.timeout
|
35
|
+
SugarCRM.session.connection_pool.timeout += 1
|
36
|
+
|
37
|
+
assert_equal timeout + 1, SugarCRM.session.connection_pool.timeout
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestFinders < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM::Base instance" do
|
5
|
+
should "always return an Array when :all" do
|
6
|
+
users = SugarCRM::User.all(:limit => 10)
|
7
|
+
assert_instance_of Array, users
|
8
|
+
users = SugarCRM::User.find(:all, :conditions => {:user_name => "= #{users.first.user_name}"})
|
9
|
+
assert_instance_of Array, users
|
10
|
+
assert_equal 1, users.length
|
11
|
+
users = SugarCRM::User.find(:all, :conditions => {:user_name => '= invalid_user_123'})
|
12
|
+
assert_instance_of Array, users
|
13
|
+
assert users.length == 0
|
14
|
+
end
|
15
|
+
|
16
|
+
should "support finding first instance with default sort order (for module using date_entered as creation date)" do
|
17
|
+
expected_account = SugarCRM::Account.first({:order_by => 'date_entered'})
|
18
|
+
account = nil
|
19
|
+
assert_nothing_raised do
|
20
|
+
account = SugarCRM::Account.first
|
21
|
+
end
|
22
|
+
assert_equal expected_account.id, account.id
|
23
|
+
end
|
24
|
+
|
25
|
+
should "support finding first instance with default sort order (for module using date_created as creation date)" do
|
26
|
+
expected_email = SugarCRM::EmailAddress.first({:order_by => 'date_created'})
|
27
|
+
email = nil
|
28
|
+
assert_nothing_raised do
|
29
|
+
email = SugarCRM::EmailAddress.first
|
30
|
+
end
|
31
|
+
assert_equal expected_email.id, email.id
|
32
|
+
end
|
33
|
+
|
34
|
+
should "support finding first instance (sorted by attribute)" do
|
35
|
+
account = SugarCRM::Account.first({
|
36
|
+
:order_by => 'name'
|
37
|
+
})
|
38
|
+
assert_instance_of SugarCRM::Account, account
|
39
|
+
end
|
40
|
+
|
41
|
+
should "support finding last instance (sorted by attribute)" do
|
42
|
+
expected_account = SugarCRM::Account.first({:order_by => 'name DESC'})
|
43
|
+
account = SugarCRM::Account.last({:order_by => 'name'})
|
44
|
+
assert_equal expected_account.id, account.id
|
45
|
+
|
46
|
+
expected_account = SugarCRM::Account.first({:order_by => 'name DESC'})
|
47
|
+
account = SugarCRM::Account.last({:order_by => 'name ASC'})
|
48
|
+
assert_equal expected_account.id, account.id
|
49
|
+
|
50
|
+
expected_account = SugarCRM::Account.first({:order_by => 'name ASC'})
|
51
|
+
account = SugarCRM::Account.last({:order_by => 'name DESC'})
|
52
|
+
assert_equal expected_account.id, account.id
|
53
|
+
end
|
54
|
+
|
55
|
+
should "support finding last instance with symbol as :order_by option" do
|
56
|
+
expected_account = SugarCRM::Account.first({:order_by => 'id DESC'})
|
57
|
+
account = SugarCRM::Account.last({:order_by => :id})
|
58
|
+
assert_equal expected_account.id, account.id
|
59
|
+
end
|
60
|
+
|
61
|
+
should "support finding last instance (last created)" do
|
62
|
+
expected_account = SugarCRM::Account.first({:order_by => 'date_entered DESC'})
|
63
|
+
account = SugarCRM::Account.last
|
64
|
+
assert_equal expected_account.id, account.id
|
65
|
+
end
|
66
|
+
|
67
|
+
should "support returning only certain fields" do
|
68
|
+
user = SugarCRM::User.first(:fields => [:first_name, :department])
|
69
|
+
assert_instance_of SugarCRM::User, user
|
70
|
+
end
|
71
|
+
|
72
|
+
should "raise a RuntimeError when searching for last instance with multiple order clauses" do
|
73
|
+
assert_raise(RuntimeError){ SugarCRM::Account.last({:order_by => 'name, id DESC'}) }
|
74
|
+
end
|
75
|
+
|
76
|
+
should "raise a RuntimeError when searching for last instance if order clause has weird format" do
|
77
|
+
assert_raise(RuntimeError){ SugarCRM::Account.last({:order_by => 'name id DESC'}) }
|
78
|
+
assert_raise(RuntimeError){ SugarCRM::Account.last({:order_by => 'name DESC id'}) }
|
79
|
+
end
|
80
|
+
|
81
|
+
should "support searching based on conditions" do
|
82
|
+
accounts = SugarCRM::Account.all({
|
83
|
+
:conditions => { :billing_address_postalcode => ["> '70000'", "< '79999'" ] },
|
84
|
+
:limit => 2,
|
85
|
+
:order_by => 'billing_address_postalcode'
|
86
|
+
})
|
87
|
+
assert_instance_of SugarCRM::Account, accounts.first
|
88
|
+
end
|
89
|
+
|
90
|
+
should "support searching based on SQL operators" do
|
91
|
+
accounts = SugarCRM::Account.all({
|
92
|
+
:conditions => { :name => "LIKE '%Inc%'" }
|
93
|
+
})
|
94
|
+
assert accounts
|
95
|
+
assert_instance_of SugarCRM::Account, accounts.first
|
96
|
+
end
|
97
|
+
|
98
|
+
should "return an an instance of itself when sent #find(id)" do
|
99
|
+
assert_instance_of SugarCRM::User, SugarCRM::User.find(1)
|
100
|
+
end
|
101
|
+
|
102
|
+
should "receive a response containing all fields when sent #get_entry" do
|
103
|
+
u = SugarCRM::User.find(1)
|
104
|
+
assert_not_nil u.user_name
|
105
|
+
end
|
106
|
+
|
107
|
+
should "return an array of records when sent #find([id1, id2, id3])" do
|
108
|
+
users = SugarCRM::User.find(["seed_sarah_id", 1])
|
109
|
+
assert_not_nil users.last.user_name
|
110
|
+
end
|
111
|
+
|
112
|
+
# test Base#find_by_sql edge case
|
113
|
+
should "return an array of records with small limit and an offset of 0" do
|
114
|
+
accounts = SugarCRM::Account.all(:limit => 3, :offset => 0)
|
115
|
+
assert_equal 3, accounts.size
|
116
|
+
end
|
117
|
+
|
118
|
+
# test Base#find_by_sql edge case: force slize size to vary up and down
|
119
|
+
should "return an array of records with small offset and a limit greater than 5 but not divisible by 5" do
|
120
|
+
accounts = SugarCRM::Account.all(:limit => 13, :offset => 2)
|
121
|
+
assert_equal 13, accounts.size
|
122
|
+
end
|
123
|
+
|
124
|
+
# test Base#find_by_sql standard case
|
125
|
+
should "return an array of records with high limit" do
|
126
|
+
accounts = SugarCRM::Account.all(:limit => 12)
|
127
|
+
assert_equal 12, accounts.size
|
128
|
+
end
|
129
|
+
|
130
|
+
should "accept a block" do
|
131
|
+
# try small limit which will return result on the first result slice (and call yield block only once)
|
132
|
+
count = 0
|
133
|
+
assert_nothing_raised do
|
134
|
+
SugarCRM::Account.all(:limit => 2){|a|
|
135
|
+
count += 1
|
136
|
+
}
|
137
|
+
end
|
138
|
+
assert_equal 2, count
|
139
|
+
|
140
|
+
# try larger limit which will require multiple result slices to be fetched and yielded individually (yield block called for each result slice)
|
141
|
+
count = 0
|
142
|
+
assert_nothing_raised do
|
143
|
+
SugarCRM::Account.all(:limit => 12){|a|
|
144
|
+
count += 1
|
145
|
+
}
|
146
|
+
end
|
147
|
+
assert_equal 12, count
|
148
|
+
end
|
149
|
+
|
150
|
+
should "retrieve all records (with no limit option) correctly" do
|
151
|
+
count = 0
|
152
|
+
SugarCRM::Account.all{|a|
|
153
|
+
count += 1
|
154
|
+
}
|
155
|
+
assert_equal SugarCRM::Account.count, count
|
156
|
+
end
|
157
|
+
|
158
|
+
should "return an array of records when using :order_by, :limit, and :offset options" do
|
159
|
+
accounts = SugarCRM::Account.all(:order_by => 'name', :limit => 3, :offset => 10)
|
160
|
+
accounts_api = SugarCRM.connection.get_entry_list('Accounts', '1=1', :order_by => 'name', :limit => 3, :offset => 10)
|
161
|
+
assert_equal accounts_api, accounts
|
162
|
+
end
|
163
|
+
|
164
|
+
should "return an array of records working around a SugarCRM bug when :limit > :offset" do
|
165
|
+
accounts = SugarCRM::Account.all(:order_by => 'name', :limit => 10, :offset => 2)
|
166
|
+
assert_equal 10, accounts.size
|
167
|
+
end
|
168
|
+
|
169
|
+
should "return an array of 1 record with :limit => 1, :offset => 1" do
|
170
|
+
accounts = SugarCRM::Account.all(:order_by => 'name', :limit => 1, :offset => 1)
|
171
|
+
assert_equal 1, accounts.size
|
172
|
+
end
|
173
|
+
|
174
|
+
should "ignore :offset => 0" do
|
175
|
+
accounts = SugarCRM::Account.all(:order_by => 'name', :limit => 3)
|
176
|
+
accounts_offset = SugarCRM::Account.all(:order_by => 'name', :limit => 3, :offset => 0)
|
177
|
+
assert_equal accounts, accounts_offset
|
178
|
+
end
|
179
|
+
|
180
|
+
should "compute offsets correctly" do
|
181
|
+
accounts = SugarCRM::Account.all(:order_by => 'name', :limit => 10, :offset => 3)
|
182
|
+
accounts_first_slice = SugarCRM::Account.all(:order_by => 'name', :limit => 5, :offset => 3)
|
183
|
+
accounts_second_slice = SugarCRM::Account.all(:order_by => 'name', :limit => 5, :offset => 8)
|
184
|
+
assert_equal accounts, accounts_first_slice.concat(accounts_second_slice)
|
185
|
+
end
|
186
|
+
|
187
|
+
should "return an instance of User when sent User#find_by_username" do
|
188
|
+
u = SugarCRM::User.find_by_user_name("sarah")
|
189
|
+
assert_equal "sarah@example.com", u.email_addresses.first.email_address
|
190
|
+
end
|
191
|
+
|
192
|
+
should "create or retrieve a record when #find_or_create_by_name" do
|
193
|
+
a = SugarCRM::Account.find_or_create_by_name("Really Important Co. Name")
|
194
|
+
assert_instance_of SugarCRM::Account, a
|
195
|
+
assert !a.new?
|
196
|
+
b = SugarCRM::Account.find_or_create_by_name("Really Important Co. Name")
|
197
|
+
assert a == b
|
198
|
+
assert a.delete
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
data/test/test_module.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestModule < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM::Module instance" do
|
5
|
+
should "respond to #fields" do
|
6
|
+
assert_respond_to SugarCRM.modules[0], :fields
|
7
|
+
end
|
8
|
+
|
9
|
+
should "return required fields when #required_fields" do
|
10
|
+
assert SugarCRM::Account._module.required_fields.include? :name
|
11
|
+
end
|
12
|
+
|
13
|
+
# TODO: Figure out a way to test this.
|
14
|
+
#should "return the custom table name when #custom_table_name" do
|
15
|
+
# assert_equal "accounts_cstm", SugarCRM::Account._module.custom_table_name
|
16
|
+
#end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "SugarCRM::Module" do
|
20
|
+
should "find modules" do
|
21
|
+
assert_instance_of SugarCRM::Module, SugarCRM::Module.find("Accounts")
|
22
|
+
end
|
23
|
+
|
24
|
+
should "(de)register all modules" do
|
25
|
+
assert SugarCRM.modules.size > 0
|
26
|
+
assert SugarCRM.session.namespace_const.const_defined? 'User'
|
27
|
+
|
28
|
+
SugarCRM::Module.deregister_all(SugarCRM.session)
|
29
|
+
assert SugarCRM.modules.size == 0
|
30
|
+
assert ! (SugarCRM.session.namespace_const.const_defined? 'User')
|
31
|
+
|
32
|
+
SugarCRM::Module.register_all(SugarCRM.session)
|
33
|
+
assert SugarCRM.modules.size > 0
|
34
|
+
assert SugarCRM.session.namespace_const.const_defined? 'User'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "The SugarCRM class" do
|
39
|
+
should "return current user" do
|
40
|
+
current_user = SugarCRM.current_user
|
41
|
+
assert_instance_of SugarCRM::User, current_user
|
42
|
+
assert_equal SugarCRM.config[:username], current_user.user_name
|
43
|
+
end
|
44
|
+
|
45
|
+
should "implement reload!" do
|
46
|
+
assert_nothing_raised do
|
47
|
+
SugarCRM.reload!
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestRequest < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM::Request instance" do
|
5
|
+
setup do
|
6
|
+
@url = "http://localhost/sugarcrm"
|
7
|
+
@method = "get_entry"
|
8
|
+
@json = <<-EOF
|
9
|
+
{
|
10
|
+
"session": "an invalid session",
|
11
|
+
"module_name": "Accounts",
|
12
|
+
"name_value_list": {
|
13
|
+
"name": {
|
14
|
+
"name": "name",
|
15
|
+
"value": "A Test Meeting" },
|
16
|
+
"date_start": {
|
17
|
+
"name": "date_start",
|
18
|
+
"value": "2011-11-23 12:03:16" },
|
19
|
+
"description": {
|
20
|
+
"name": "description",
|
21
|
+
"value": ""OMG HAI!"" }
|
22
|
+
}
|
23
|
+
}
|
24
|
+
EOF
|
25
|
+
@json.gsub!(/^\s{6}/, '')
|
26
|
+
@request = SugarCRM::Request.new(@url, @method, @json, false)
|
27
|
+
end
|
28
|
+
|
29
|
+
should "properly escape JSON" do
|
30
|
+
assert_equal "%7B%22hello%22%3A+%22%5C%22OMG+HAI%21%5C%22%22%7D", @request.escape('{"hello": ""OMG HAI!""}')
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestResponse < ActiveSupport::TestCase
|
4
|
+
context "A SugarCRM::Response instance" do
|
5
|
+
setup do
|
6
|
+
@json = {"entry_list"=> [{
|
7
|
+
"name_value_list"=> {
|
8
|
+
"address_city" => {"name"=>"address_city", "value"=>""},
|
9
|
+
"receive_notifications" => {"name"=>"receive_notifications", "value"=>"1"},
|
10
|
+
"is_group" => {"name"=>"is_group", "value"=>"0"},
|
11
|
+
"pwd_last_changed" => {"name"=>"pwd_last_changed", "value"=>"never"}
|
12
|
+
},
|
13
|
+
"id"=>"1",
|
14
|
+
"module_name"=>"Users"
|
15
|
+
}],
|
16
|
+
"relationship_list"=>[]}
|
17
|
+
|
18
|
+
@response = SugarCRM::Response.handle(@json, SugarCRM.session)
|
19
|
+
end
|
20
|
+
|
21
|
+
should "return an instance of a SugarCRM Module" do
|
22
|
+
assert_instance_of SugarCRM::User, @response
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|