blob: 4aa1da6cdb99077dda20a01e340ca816cb104495 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
describe Usergrid::Ironhorse::Base do
it_should_behave_like 'ActiveModel'
class User < Usergrid::Ironhorse::Base
extend Usergrid::Ironhorse::UserContext
end
before :all do
@application = create_random_application
Foo.configure!(@application.url, @application.auth_token)
@user = create_random_user @application, true
@foo = (@application.create_entity 'foos', name: 'foo42', answer: 42).entity
end
after :all do
@foo.delete
@user.delete
#delete_application @application # not supported on server yet
end
class Foo < Usergrid::Ironhorse::Base; end
Foo.validates :name, :presence => true
class Bar < Usergrid::Ironhorse::Base; end
describe 'subclasses should be able to' do
it "do tasks as admin when requested" do
organization = @foo.management.organization SPEC_SETTINGS[:organization][:name]
organization.logout
# should fail under current user's context
expect {
organization.create_application "_test_app_#{SecureRandom.hex}"
}.to raise_error RestClient::Unauthorized
# should succeed under admin context
User.as_admin do
organization.create_application "_test_app_#{SecureRandom.hex}"
end
end
it "do tasks as admin if require_login is false" do
organization = @foo.management.organization SPEC_SETTINGS[:organization][:name]
organization.logout
# should fail under current user's context
expect {
organization.create_application "_test_app_#{SecureRandom.hex}"
}.to raise_error RestClient::Unauthorized
# should succeed once require_login is false
User.settings[:require_login] = false
organization.create_application "_test_app_#{SecureRandom.hex}"
User.settings[:require_login] = true
end
it 'be created and destroyed' do
foo = Foo.create name: 'foo man'
foo.persisted?.should be_true
foo.name.should eq 'foo man'
foo = Foo.find_by_name 'foo man'
foo.should_not be_nil
foo.destroy.should be_true
foo.persisted?.should be_false
foo = Foo.find_by_name 'foo man'
foo.should be_nil
end
it 'be changed and saved' do
foo = Foo.find_by_name @foo.name
foo.answer.should eq @foo.answer
foo.number = 43
foo.changed?.should be_true
foo.number.should == 43
foo.save!
foo = Foo.find_by_name @foo.name
foo.number.should == 43
end
it 'be reloaded' do
foo = Foo.find @foo.uuid
foo.answer = 44
foo.changed?.should be_true
foo.answer.should == 44
foo.reload
foo.answer.should == 42
end
it 'be found using find_by_name' do
foo = Foo.find_by_name @foo.name
foo.uuid.should_not be_nil
foo.name.should eq @foo.name
foo.should be_a Foo
foo.persisted?.should be_true
end
it 'be found using find_by_name!' do
foo = Foo.find_by_name! @foo.name
foo.uuid.should_not be_nil
foo.name.should eq @foo.name
foo.should be_a Foo
foo.persisted?.should be_true
end
it 'throw a RecordNotFound when find_by_name! misses' do
expect { Foo.find_by_name! 'name3' }.to raise_error(ActiveRecord::RecordNotFound)
end
it 'add a validation' do
foo = Foo.new
foo.valid?.should be_false
foo.name = 'joe'
foo.valid?.should be_true
end
it 'fail to save an invalid record and save the errors' do
foo = Foo.new
foo.save.should be_false
foo.persisted?.should be_false
foo.errors.count.should == 1
foo.errors.get(:name).first.should eq "can't be blank"
end
it 'fail to create an invalid record and save the errors' do
foo = Foo.create
foo.persisted?.should be_false
foo.errors.count.should == 1
foo.errors.get(:name).first.should eq "can't be blank"
end
it 'fail to save! an invalid record' do
expect { Foo.new.save! }.to raise_error(ActiveRecord::RecordNotSaved)
end
it 'fail to create! an invalid record' do
expect { Foo.create! }.to raise_error(ActiveRecord::RecordNotSaved)
end
it 'retrieve first' do
foo2 = Foo.create! name: 'foo2'
foo = Foo.first
foo.uuid.should eq @foo.uuid
foo2.destroy
end
it 'retrieve last' do
foo2 = Foo.create! name: 'foo2'
foo = Foo.last
foo.uuid.should eq foo2.uuid
foo2.destroy
end
it 'take multiple' do
foo2 = Foo.create! name: 'foo2'
foos = Foo.take(2)
foos.size.should == 2
foos.first.uuid.should_not be_nil
foo2.destroy
end
it 'find multiple by id' do
foo2 = Foo.create name: 'foo2'
foos = Foo.find @foo.uuid, foo2.uuid
foos.size.should == 2
foos.first.uuid.should eq @foo.uuid
foos.last.uuid.should eq foo2.uuid
foo2.destroy
end
it 'find multiple by name' do
foo2 = Foo.create! name: 'foo2'
foos = Foo.find @foo.name, foo2.name
foos.size.should == 2
foos.first.uuid.should eq @foo.uuid
foos.last.uuid.should eq foo2.uuid
foo2.destroy
end
it 'check exists?(string)' do
Foo.exists?(@foo.name).should be_true
end
it 'check not exists?(string)' do
Foo.exists?('asdfasdf').should be_false
end
it 'check exists?(Array)' do
Foo.exists?(['name = ?', @foo.name]).should be_true
end
it 'check not exists?(Array)' do
Foo.exists?(['name = ?', 'asdfasdf']).should be_false
end
it 'check exists?(Hash)' do
Foo.exists?(name: @foo.name).should be_true
end
it 'check not exists?(Hash)' do
Foo.exists?(name: 'asfasdf').should be_false
end
it 'check exists?(nil)' do
Foo.exists?.should be_true
end
it 'check not exists?(nil)' do
Bar.exists?.should be_false
end
it 'perform first_or_create where found' do
foo = Foo.where(name: @foo.name).first_or_create
foo.uuid.should eq @foo.uuid
end
it 'perform first_or_create where not found' do
foo = Foo.where(name: 'foo2').first_or_create(number: 42)
foo.name.should eq 'foo2'
foo.number.should == 42
foo.destroy
end
it 'perform first_or_create! where found' do
foo = Foo.where(name: @foo.name).first_or_create!
foo.uuid.should eq @foo.uuid
end
it 'perform first_or_create! where not found' do
expect { Foo.where(nuumber: 'foo2').first_or_create! }.to raise_error(ActiveRecord::RecordNotSaved)
end
it 'perform first_or_initialize where found' do
foo = Foo.where(name: @foo.name).first_or_initialize(xxx: 42)
foo.uuid.should eq @foo.uuid
foo.xxx.should be_nil
end
it 'perform first_or_initialize where not found' do
foo = Foo.where(name: 'foo2').first_or_initialize(number: 42)
foo.name.should eq 'foo2'
foo.number.should == 42
foo.persisted?.should be_false
end
it "should destroy by id" do
foo = Foo.create! name: 'foo'
Foo.destroy(foo.id)
foo = Foo.find_by_name 'foo'
foo.should be_nil
end
it "should destroy by ids" do
foo = Foo.create! name: 'foo'
foo2 = Foo.create! name: 'foo2'
Foo.destroy([foo.id, foo2.id])
Foo.find_by_name('foo').should be_nil
Foo.find_by_name('foo2').should be_nil
end
it "should destroy_all" do
foo = Foo.create! name: 'foo', number: 42
foo2 = Foo.create! name: 'foo2', number: 42
Foo.destroy_all(number: 42)
Foo.find_by_name('foo').should be_nil
Foo.find_by_name('foo2').should be_nil
end
it "should delete by id" do
foo = Foo.create! name: 'foo'
Foo.delete(foo.id)
foo = Foo.find_by_name 'foo'
foo.should be_nil
end
it "should delete by ids" do
foo = Foo.create! name: 'foo'
foo2 = Foo.create! name: 'foo2'
Foo.delete([foo.id, foo2.id])
Foo.find_by_name('foo').should be_nil
Foo.find_by_name('foo2').should be_nil
end
it "should delete_all" do
foo = Foo.create! name: 'foo', number: 42
foo2 = Foo.create! name: 'foo2', number: 42
Foo.delete_all(number: 42)
Foo.find_by_name('foo').should be_nil
Foo.find_by_name('foo2').should be_nil
end
it "should update one" do
foo = Foo.create! name: 'foo', number: 42
Foo.update foo.uuid, { number: 43 }
foo.reload.number.should == 43
foo.destroy
end
it "should update multiple" do
foo = Foo.create! name: 'foo', number: 42
foo2 = Foo.create! name: 'foo2', number: 42
updates = { foo.uuid => {number: 43}, foo2.uuid => {number: 44}}
Foo.update(updates.keys, updates.values)
foo.reload.number.should == 43
foo2.reload.number.should == 44
foo.destroy
foo2.destroy
end
it "should update_all" do
foo = Foo.create! name: 'foo', number: 43
Foo.where(number: 43).update_all({number: 44})
Foo.find_by_number(44).should_not be_nil
foo.destroy
end
it "should fail on unaccessible mass assignment" do
Foo.attr_accessible :name
foo = Foo.create! name: 'foo', number: 43
foo.number.should_not eq 43
foo.update_attributes number: 44, foo: 'bar'
foo.number.should_not eq 44
foo.destroy
Foo._accessible_attributes = nil
end
it "should fail on protected mass assignment" do
Foo.attr_protected :number
foo = Foo.create! name: 'foo', number: 43
foo.number.should_not eq 43
foo.update_attributes number: 44, foo: 'bar'
foo.number.should_not eq 44
foo.destroy
Foo._protected_attributes = nil
end
it "should be able to page through results" do
bars = (1..15).collect do |i|
Bar.create! name: "name_#{i}", value: "value_#{i+1}"
end
query = Bar.all
page = query.to_a # first page
page.count.should eq 10
page = query.next_page # second page
count = 10
page.each do |bar|
bars[count].name.should eq bar.name
count += 1
end
count.should eq bars.count
bars.each {|bar| bar.delete}
end
it "should iterate past page boundaries" do
bars = (1..15).collect do |i|
Bar.create! name: "name_#{i}", value: "value_#{i+1}"
end
count = 0
Bar.all.each do |bar|
bars[count].name.should eq bar.name
count += 1
end
count.should eq bars.count
bars.each {|bar| bar.delete}
end
it "should honor limit" do
bars = (1..15).collect do |i|
Bar.create! name: "name_#{i}", value: "value_#{i+1}"
end
count = 0
Bar.limit(13).each do |bar|
bars[count].name.should eq bar.name
count += 1
end
count.should eq 13
bars.each {|bar| bar.delete}
end
it "perform as admin only when requested if require_login is true" do
organization = @foo.management.organization SPEC_SETTINGS[:organization][:name]
creds = nil
User.as_admin do
creds = organization.credentials
end
Usergrid::Ironhorse::Base.settings[:client_id] = creds.data.credentials.client_id
Usergrid::Ironhorse::Base.settings[:client_secret] = creds.data.credentials.client_secret
Usergrid::Ironhorse::Base.settings[:auth_token] = nil
User.clear_thread_context
organization.logout
User.settings[:require_login] = true
# should fail (login is required)
expect {
organization.create_application "_test_app_#{SecureRandom.hex}"
}.to raise_error RestClient::Unauthorized
# should succeed under admin context
User.as_admin do
organization.create_application "_test_app_#{SecureRandom.hex}"
end
Usergrid::Ironhorse::Base.settings[:client_id] = nil
Usergrid::Ironhorse::Base.settings[:client_secret] = nil
end
it "perform as admin if require_login is false" do
organization = @foo.management.organization SPEC_SETTINGS[:organization][:name]
organization.logout
creds = nil
User.as_admin do
creds = organization.credentials
end
Usergrid::Ironhorse::Base.settings[:client_id] = creds.data.credentials.client_id
Usergrid::Ironhorse::Base.settings[:client_secret] = creds.data.credentials.client_secret
Usergrid::Ironhorse::Base.settings[:auth_token] = nil
User.clear_thread_context
organization.logout
User.settings[:require_login] = false
# should succeed
organization.create_application "_test_app_#{SecureRandom.hex}"
Usergrid::Ironhorse::Base.settings[:client_id] = nil
Usergrid::Ironhorse::Base.settings[:client_secret] = nil
end
end
end