Added unit tests to test user avatars.
This commit is contained in:
parent
3ab6773c8c
commit
eb0a01eaa1
4 changed files with 162 additions and 34 deletions
|
@ -18,7 +18,7 @@ class App.User extends App.Model
|
||||||
{ name: 'street', display: 'Street', tag: 'input', type: 'text', limit: 100, null: true, class: 'span4', signup: false, quick: true, info: true },
|
{ name: 'street', display: 'Street', tag: 'input', type: 'text', limit: 100, null: true, class: 'span4', signup: false, quick: true, info: true },
|
||||||
{ name: 'zip', display: 'Zip', tag: 'input', type: 'text', limit: 100, null: true, class: 'span4', signup: false, quick: true, info: true },
|
{ name: 'zip', display: 'Zip', tag: 'input', type: 'text', limit: 100, null: true, class: 'span4', signup: false, quick: true, info: true },
|
||||||
{ name: 'city', display: 'City', tag: 'input', type: 'text', limit: 100, null: true, class: 'span4', signup: false, quick: true, info: true },
|
{ name: 'city', display: 'City', tag: 'input', type: 'text', limit: 100, null: true, class: 'span4', signup: false, quick: true, info: true },
|
||||||
{ name: 'password', display: 'Password', tag: 'input', type: 'password', limit: 50, null: true, autocomplete: 'off', class: 'span4', signup: true, quick: false, },
|
{ name: 'password', display: 'Password', tag: 'input', type: 'password', limit: 50, null: true, autocomplete: 'off', class: 'span4', signup: true, quick: false },
|
||||||
{ name: 'note', display: 'Note', tag: 'textarea', note: 'Notes are visible to agents only, never to customers.', limit: 250, null: true, class: 'span4', quick: true, info: true },
|
{ name: 'note', display: 'Note', tag: 'textarea', note: 'Notes are visible to agents only, never to customers.', limit: 250, null: true, class: 'span4', quick: true, info: true },
|
||||||
{ name: 'role_ids', display: 'Roles', tag: 'checkbox', multiple: true, null: false, relation: 'Role', class: 'span4' },
|
{ name: 'role_ids', display: 'Roles', tag: 'checkbox', multiple: true, null: false, relation: 'Role', class: 'span4' },
|
||||||
{ name: 'group_ids', display: 'Groups', tag: 'checkbox', multiple: true, null: true, relation: 'Group', class: 'span4', invite_agent: true },
|
{ name: 'group_ids', display: 'Groups', tag: 'checkbox', multiple: true, null: true, relation: 'Group', class: 'span4', invite_agent: true },
|
||||||
|
|
|
@ -590,31 +590,19 @@ curl http://localhost/api/v1/users/image/8d6cca1c6bdc226cf2ba131e264ca2c7 -v -u
|
||||||
response.headers["Cache-Control"] = "cache, store, max-age=31536000, must-revalidate"
|
response.headers["Cache-Control"] = "cache, store, max-age=31536000, must-revalidate"
|
||||||
response.headers["Pragma"] = "cache"
|
response.headers["Pragma"] = "cache"
|
||||||
|
|
||||||
# serve user image
|
|
||||||
user = User.where( :image => params[:hash] ).first
|
user = User.where( :image => params[:hash] ).first
|
||||||
if user
|
if user
|
||||||
# find file
|
image = user.get_image
|
||||||
list = Store.list( :object => 'User::Image', :o_id => user.id )
|
|
||||||
if list && list[0]
|
|
||||||
file = Store.find( list[0] )
|
|
||||||
send_data(
|
send_data(
|
||||||
file.content,
|
image[:content],
|
||||||
:filename => file.filename,
|
:filename => image[:filename],
|
||||||
:type => file.preferences['Content-Type'] || file.preferences['Mime-Type'],
|
:type => image[:content_type],
|
||||||
:disposition => 'inline'
|
:disposition => 'inline'
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
# serve defalt image
|
render :json => {}, :status => 404
|
||||||
image = 'R0lGODdhMAAwAOMAAMzMzJaWlr6+vqqqqqOjo8XFxbe3t7GxsZycnAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAMAAwAAAEcxDISau9OOvNu/9gKI5kaZ5oqq5s675wLM90bd94ru98TwuAA+KQAQqJK8EAgBAgMEqmkzUgBIeSwWGZtR5XhSqAULACCoGCJGwlm1MGQrq9RqgB8fm4ZTUgDBIEcRR9fz6HiImKi4yNjo+QkZKTlJWWkBEAOw=='
|
|
||||||
send_data(
|
|
||||||
Base64.decode64(image),
|
|
||||||
:filename => 'image.gif',
|
|
||||||
:type => 'image/gif',
|
|
||||||
:disposition => 'inline',
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -487,6 +487,48 @@ returns
|
||||||
self.save
|
self.save
|
||||||
end
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
|
||||||
|
get image of user
|
||||||
|
|
||||||
|
user = User.find(123)
|
||||||
|
result = user.get_image
|
||||||
|
|
||||||
|
returns
|
||||||
|
|
||||||
|
result = {
|
||||||
|
:filename => 'some filename',
|
||||||
|
:content_type => 'image/png',
|
||||||
|
:content => bin_string,
|
||||||
|
}
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
def get_image
|
||||||
|
|
||||||
|
# find file
|
||||||
|
list = Store.list( :object => 'User::Image', :o_id => self.id )
|
||||||
|
puts list.inspect
|
||||||
|
if list && list[0]
|
||||||
|
file = Store.find( list[0] )
|
||||||
|
result = {
|
||||||
|
:content => file.content,
|
||||||
|
:filename => file.filename,
|
||||||
|
:content_type => file.preferences['Content-Type'] || file.preferences['Mime-Type'],
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
# serve defalt image
|
||||||
|
image = 'R0lGODdhMAAwAOMAAMzMzJaWlr6+vqqqqqOjo8XFxbe3t7GxsZycnAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAMAAwAAAEcxDISau9OOvNu/9gKI5kaZ5oqq5s675wLM90bd94ru98TwuAA+KQAQqJK8EAgBAgMEqmkzUgBIeSwWGZtR5XhSqAULACCoGCJGwlm1MGQrq9RqgB8fm4ZTUgDBIEcRR9fz6HiImKi4yNjo+QkZKTlJWWkBEAOw=='
|
||||||
|
result = {
|
||||||
|
:content => Base64.decode64(image),
|
||||||
|
:filename => 'image.gif',
|
||||||
|
:content_type => 'image/gif',
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def check_name
|
def check_name
|
||||||
|
@ -552,6 +594,7 @@ returns
|
||||||
if self.email
|
if self.email
|
||||||
hash = Digest::MD5.hexdigest(self.email)
|
hash = Digest::MD5.hexdigest(self.email)
|
||||||
self.image_source = "http://www.gravatar.com/avatar/#{hash}?s=48&d=404"
|
self.image_source = "http://www.gravatar.com/avatar/#{hash}?s=48&d=404"
|
||||||
|
#puts "#{self.email}: http://www.gravatar.com/avatar/#{hash}?s=48&d=404"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -566,20 +609,20 @@ returns
|
||||||
if !response.success?
|
if !response.success?
|
||||||
self.update_column( :image, 'none' )
|
self.update_column( :image, 'none' )
|
||||||
self.cache_delete
|
self.cache_delete
|
||||||
#puts "WARNING: Can't fetch '#{self.image_source}', http code: #{response.code.to_s}"
|
#puts "WARNING: Can't fetch '#{self.image_source}' (maybe no avatar available), http code: #{response.code.to_s}"
|
||||||
#raise "Can't fetch '#{self.image_source}', http code: #{response.code.to_s}"
|
#raise "Can't fetch '#{self.image_source}', http code: #{response.code.to_s}"
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
#puts "NOTICE: Fetch '#{self.image_source}', http code: #{response.code.to_s}"
|
||||||
|
|
||||||
# store image local
|
# store image local
|
||||||
hash = Digest::MD5.hexdigest( response.body )
|
hash = Digest::MD5.hexdigest( response.body )
|
||||||
|
|
||||||
# check if image has changed
|
# check if image has changed
|
||||||
return if self.image == hash
|
return if self.image == hash
|
||||||
|
#puts "NOTICE: update image in store"
|
||||||
# save new image
|
# save new image
|
||||||
self.update_column( :image, hash )
|
self.update_column( :image, hash )
|
||||||
self.cache_delete
|
|
||||||
Store.remove( :object => 'User::Image', :o_id => self.id )
|
Store.remove( :object => 'User::Image', :o_id => self.id )
|
||||||
Store.add(
|
Store.add(
|
||||||
:object => 'User::Image',
|
:object => 'User::Image',
|
||||||
|
@ -591,6 +634,7 @@ returns
|
||||||
},
|
},
|
||||||
:created_by_id => self.updated_by_id,
|
:created_by_id => self.updated_by_id,
|
||||||
)
|
)
|
||||||
|
self.cache_delete
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_password
|
def check_password
|
||||||
|
|
|
@ -5,6 +5,7 @@ class UserTest < ActiveSupport::TestCase
|
||||||
test 'user' do
|
test 'user' do
|
||||||
tests = [
|
tests = [
|
||||||
{
|
{
|
||||||
|
:name => '#1 - simple create',
|
||||||
:create => {
|
:create => {
|
||||||
:firstname => 'Firstname',
|
:firstname => 'Firstname',
|
||||||
:lastname => 'Lastname',
|
:lastname => 'Lastname',
|
||||||
|
@ -16,11 +17,13 @@ class UserTest < ActiveSupport::TestCase
|
||||||
:create_verify => {
|
:create_verify => {
|
||||||
:firstname => 'Firstname',
|
:firstname => 'Firstname',
|
||||||
:lastname => 'Lastname',
|
:lastname => 'Lastname',
|
||||||
|
:image => 'none',
|
||||||
:email => 'some@example.com',
|
:email => 'some@example.com',
|
||||||
:login => 'some@example.com',
|
:login => 'some@example.com',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
:name => '#2 - simple create - no lastname',
|
||||||
:create => {
|
:create => {
|
||||||
:firstname => 'Firstname Lastname',
|
:firstname => 'Firstname Lastname',
|
||||||
:lastname => '',
|
:lastname => '',
|
||||||
|
@ -32,11 +35,13 @@ class UserTest < ActiveSupport::TestCase
|
||||||
:create_verify => {
|
:create_verify => {
|
||||||
:firstname => 'Firstname',
|
:firstname => 'Firstname',
|
||||||
:lastname => 'Lastname',
|
:lastname => 'Lastname',
|
||||||
|
:image => 'none',
|
||||||
:email => 'some@example.com',
|
:email => 'some@example.com',
|
||||||
:login => 'some@example.com',
|
:login => 'some@example.com',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
:name => '#3 - simple create - nil as lastname',
|
||||||
:create => {
|
:create => {
|
||||||
:firstname => 'Firstname Lastname',
|
:firstname => 'Firstname Lastname',
|
||||||
:lastname => nil,
|
:lastname => nil,
|
||||||
|
@ -48,11 +53,13 @@ class UserTest < ActiveSupport::TestCase
|
||||||
:create_verify => {
|
:create_verify => {
|
||||||
:firstname => 'Firstname',
|
:firstname => 'Firstname',
|
||||||
:lastname => 'Lastname',
|
:lastname => 'Lastname',
|
||||||
|
:image => 'none',
|
||||||
:email => 'some@example.com',
|
:email => 'some@example.com',
|
||||||
:login => 'some@example.com',
|
:login => 'some@example.com',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
:name => '#4 - simple create - no lastname, firstname with ","',
|
||||||
:create => {
|
:create => {
|
||||||
:firstname => 'Lastname, Firstname',
|
:firstname => 'Lastname, Firstname',
|
||||||
:lastname => '',
|
:lastname => '',
|
||||||
|
@ -69,11 +76,12 @@ class UserTest < ActiveSupport::TestCase
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
:name => '#5 - simple create - no lastname/firstname',
|
||||||
:create => {
|
:create => {
|
||||||
:firstname => '',
|
:firstname => '',
|
||||||
:lastname => '',
|
:lastname => '',
|
||||||
:email => 'firstname.lastname@example.com',
|
:email => 'firstname.lastname@example.com',
|
||||||
:login => 'login',
|
:login => 'login-1',
|
||||||
:updated_by_id => 1,
|
:updated_by_id => 1,
|
||||||
:created_by_id => 1,
|
:created_by_id => 1,
|
||||||
},
|
},
|
||||||
|
@ -81,15 +89,16 @@ class UserTest < ActiveSupport::TestCase
|
||||||
:firstname => 'Firstname',
|
:firstname => 'Firstname',
|
||||||
:lastname => 'Lastname',
|
:lastname => 'Lastname',
|
||||||
:email => 'firstname.lastname@example.com',
|
:email => 'firstname.lastname@example.com',
|
||||||
:login => 'login',
|
:login => 'login-1',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
:name => '#6 - simple create - no lastname/firstnam',
|
||||||
:create => {
|
:create => {
|
||||||
:firstname => '',
|
:firstname => '',
|
||||||
:lastname => '',
|
:lastname => '',
|
||||||
:email => 'FIRSTNAME.lastname@example.com',
|
:email => 'FIRSTNAME.lastname@example.com',
|
||||||
:login => 'login',
|
:login => 'login-2',
|
||||||
:updated_by_id => 1,
|
:updated_by_id => 1,
|
||||||
:created_by_id => 1,
|
:created_by_id => 1,
|
||||||
},
|
},
|
||||||
|
@ -97,15 +106,16 @@ class UserTest < ActiveSupport::TestCase
|
||||||
:firstname => 'Firstname',
|
:firstname => 'Firstname',
|
||||||
:lastname => 'Lastname',
|
:lastname => 'Lastname',
|
||||||
:email => 'firstname.lastname@example.com',
|
:email => 'firstname.lastname@example.com',
|
||||||
:login => 'login',
|
:login => 'login-2',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
:name => '#7 - simple create - nill as fristname and lastname',
|
||||||
:create => {
|
:create => {
|
||||||
:firstname => nil,
|
:firstname => nil,
|
||||||
:lastname => nil,
|
:lastname => nil,
|
||||||
:email => 'FIRSTNAME.lastname@example.com',
|
:email => 'FIRSTNAME.lastname@example.com',
|
||||||
:login => 'login',
|
:login => 'login-3',
|
||||||
:updated_by_id => 1,
|
:updated_by_id => 1,
|
||||||
:created_by_id => 1,
|
:created_by_id => 1,
|
||||||
},
|
},
|
||||||
|
@ -113,18 +123,104 @@ class UserTest < ActiveSupport::TestCase
|
||||||
:firstname => 'Firstname',
|
:firstname => 'Firstname',
|
||||||
:lastname => 'Lastname',
|
:lastname => 'Lastname',
|
||||||
:email => 'firstname.lastname@example.com',
|
:email => 'firstname.lastname@example.com',
|
||||||
:login => 'login',
|
:login => 'login-3',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
:name => '#8 - update with avatar check',
|
||||||
|
:create => {
|
||||||
|
:firstname => 'Bob',
|
||||||
|
:lastname => 'Smith',
|
||||||
|
:email => 'bob.smith@example.com',
|
||||||
|
:login => 'login-4',
|
||||||
|
:updated_by_id => 1,
|
||||||
|
:created_by_id => 1,
|
||||||
|
},
|
||||||
|
:create_verify => {
|
||||||
|
:firstname => 'Bob',
|
||||||
|
:lastname => 'Smith',
|
||||||
|
:image => 'none',
|
||||||
|
:image_md5 => '76fdc28c07e4f3d7802b75aacfccdf6a',
|
||||||
|
:email => 'bob.smith@example.com',
|
||||||
|
:login => 'login-4',
|
||||||
|
},
|
||||||
|
:update => {
|
||||||
|
:email => 'unit-test1@znuny.com',
|
||||||
|
},
|
||||||
|
:update_verify => {
|
||||||
|
:firstname => 'Bob',
|
||||||
|
:lastname => 'Smith',
|
||||||
|
:image => '9f19a507f4574b8455543408a7ef2257',
|
||||||
|
:image_md5 => '9f19a507f4574b8455543408a7ef2257',
|
||||||
|
:email => 'unit-test1@znuny.com',
|
||||||
|
:login => 'login-4',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
:name => '#9 - update create with avatar check',
|
||||||
|
:create => {
|
||||||
|
:firstname => 'Bob',
|
||||||
|
:lastname => 'Smith',
|
||||||
|
:email => 'unit-test2@znuny.com',
|
||||||
|
:login => 'login-5',
|
||||||
|
:updated_by_id => 1,
|
||||||
|
:created_by_id => 1,
|
||||||
|
},
|
||||||
|
:create_verify => {
|
||||||
|
:firstname => 'Bob',
|
||||||
|
:lastname => 'Smith',
|
||||||
|
:image => 'fb83638ff260b20555b25173169135dd',
|
||||||
|
:image_md5 => 'fb83638ff260b20555b25173169135dd',
|
||||||
|
:email => 'unit-test2@znuny.com',
|
||||||
|
:login => 'login-5',
|
||||||
|
},
|
||||||
|
:update => {
|
||||||
|
:email => 'unit-test1@znuny.com',
|
||||||
|
},
|
||||||
|
:update_verify => {
|
||||||
|
:firstname => 'Bob',
|
||||||
|
:lastname => 'Smith',
|
||||||
|
:image => '9f19a507f4574b8455543408a7ef2257',
|
||||||
|
:image_md5 => '9f19a507f4574b8455543408a7ef2257',
|
||||||
|
:email => 'unit-test1@znuny.com',
|
||||||
|
:login => 'login-5',
|
||||||
|
}
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
tests.each { |test|
|
tests.each { |test|
|
||||||
|
|
||||||
|
# check if user exists
|
||||||
|
user = User.where( :login => test[:create][:login] ).first
|
||||||
|
if user
|
||||||
|
user.destroy
|
||||||
|
end
|
||||||
|
|
||||||
user = User.create( test[:create] )
|
user = User.create( test[:create] )
|
||||||
|
|
||||||
test[:create_verify].each { |key, value|
|
test[:create_verify].each { |key, value|
|
||||||
assert_equal( user[key], value )
|
next if key == :image_md5
|
||||||
|
assert_equal( value, user[key], "create check #{ key } in (#{ test[:name] })" )
|
||||||
}
|
}
|
||||||
|
if test[:create_verify][:image_md5]
|
||||||
|
file = user.get_image
|
||||||
|
file_md5 = Digest::MD5.hexdigest( file[:content] )
|
||||||
|
assert_equal( test[:create_verify][:image_md5], file_md5, "create avatar md5 check in (#{ test[:name] })" )
|
||||||
|
end
|
||||||
|
if test[:update]
|
||||||
|
user.update_attributes( test[:update] )
|
||||||
|
|
||||||
|
test[:update_verify].each { |key, value|
|
||||||
|
next if key == :image_md5
|
||||||
|
assert_equal( value, user[key], "update check #{ key } in (#{ test[:name] })" )
|
||||||
|
}
|
||||||
|
|
||||||
|
if test[:update_verify][:image_md5]
|
||||||
|
file = user.get_image
|
||||||
|
file_md5 = Digest::MD5.hexdigest( file[:content] )
|
||||||
|
assert_equal( test[:update_verify][:image_md5], file_md5, "update avatar md5 check in (#{ test[:name] })" )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
user.destroy
|
user.destroy
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue