diaspora/spec/models/profile_spec.rb
cmrd Senya 45619cb153
Account migration model and message support
This commit introduces support for AccountMigration federation message
receive. It covers the cases when the new home pod for a user is remote
respective to the recepient pod of the message. It also allows to initiate
migration locally by a podmin from the rails console. This will give the
pods a possibility to understand the account migration event on the
federation level and thus future version which will implement migration
will be backward compatible with the pods starting from this commit.
2017-08-15 01:32:34 +03:00

319 lines
10 KiB
Ruby

# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
describe Profile, :type => :model do
describe 'validation' do
describe "of first_name" do
it "strips leading and trailing whitespace" do
profile = FactoryGirl.build(:profile, :first_name => " Shelly ")
expect(profile).to be_valid
expect(profile.first_name).to eq("Shelly")
end
it "can be 32 characters long" do
profile = FactoryGirl.build(:profile, :first_name => "Hexagoooooooooooooooooooooooooon")
expect(profile).to be_valid
end
it "cannot be 33 characters" do
profile = FactoryGirl.build(:profile, :first_name => "Hexagooooooooooooooooooooooooooon")
expect(profile).not_to be_valid
end
it 'cannot have ;' do
profile = FactoryGirl.build(:profile, :first_name => "Hex;agon")
expect(profile).not_to be_valid
end
end
describe 'from_omniauth_hash' do
before do
@from_omniauth = {'first_name' => 'bob', 'last_name' => 'jones', 'description' => 'this is my bio', 'location' => 'sf', 'image' => 'http://cats.com/gif.gif'}
end
it 'outputs a hash that can update a diaspora profile' do
profile = Profile.new
expect(profile.from_omniauth_hash(@from_omniauth)['bio']).to eq('this is my bio')
end
it 'does not overwrite any exsisting profile fields' do
profile = Profile.new(:first_name => 'maxwell')
expect(profile.from_omniauth_hash(@from_omniauth)['first_name']).to eq('maxwell')
end
it 'sets full name to first name' do
@from_omniauth = {'name' => 'bob jones', 'description' => 'this is my bio', 'location' => 'sf', 'image' => 'http://cats.com/gif.gif'}
profile = Profile.new
expect(profile.from_omniauth_hash(@from_omniauth)['first_name']).to eq('bob jones')
end
end
describe '#contruct_full_name' do
it 'generates a full name given only first name' do
profile = FactoryGirl.build(:person).profile
profile.first_name = "casimiro"
profile.last_name = nil
expect(profile.full_name).not_to eq("casimiro")
profile.save
expect(profile.full_name).to eq("casimiro")
end
it 'generates a full name given only last name' do
profile = FactoryGirl.build(:person).profile
profile.first_name = nil
profile.last_name = "grippi"
expect(profile.full_name).not_to eq("grippi")
profile.save
expect(profile.full_name).to eq("grippi")
end
it 'generates a full name given first and last names' do
profile = FactoryGirl.build(:person).profile
profile.first_name = "casimiro"
profile.last_name = "grippi"
expect(profile.full_name).not_to eq("casimiro grippi")
profile.save
expect(profile.full_name).to eq("casimiro grippi")
end
end
describe "of last_name" do
it "strips leading and trailing whitespace" do
profile = FactoryGirl.build(:profile, :last_name => " Ohba ")
expect(profile).to be_valid
expect(profile.last_name).to eq("Ohba")
end
it "can be 32 characters long" do
profile = FactoryGirl.build(:profile, :last_name => "Hexagoooooooooooooooooooooooooon")
expect(profile).to be_valid
end
it "cannot be 33 characters" do
profile = FactoryGirl.build(:profile, :last_name => "Hexagooooooooooooooooooooooooooon")
expect(profile).not_to be_valid
end
it 'cannot have ;' do
profile = FactoryGirl.build(:profile, :last_name => "Hex;agon")
expect(profile).not_to be_valid
end
it 'disallows ; with a newline in the string' do
profile = FactoryGirl.build(:profile, :last_name => "H\nex;agon")
expect(profile).not_to be_valid
end
end
end
describe "of location" do
it "can be 255 characters long" do
profile = FactoryGirl.build(:profile, :location => "a"*255)
expect(profile).to be_valid
end
it "cannot be 256 characters" do
profile = FactoryGirl.build(:profile, :location => "a"*256)
expect(profile).not_to be_valid
end
end
describe "image_url setters" do
%i(image_url image_url_small image_url_medium).each do |method|
describe "##{method}=" do
before do
@profile = FactoryGirl.build(:profile)
@profile.public_send("#{method}=", "http://tom.joindiaspora.com/images/user/tom.jpg")
@pod_url = AppConfig.pod_uri.to_s.chomp("/")
end
it "saves nil when setting nil" do
@profile.public_send("#{method}=", nil)
expect(@profile[method]).to be_nil
end
it "saves nil when setting an empty string" do
@profile.public_send("#{method}=", "")
expect(@profile[method]).to be_nil
end
it "makes relative urls absolute" do
@profile.public_send("#{method}=", "/relative/url")
expect(@profile.public_send(method)).to eq("#{@pod_url}/relative/url")
end
it "doesn't change absolute urls" do
@profile.public_send("#{method}=", "http://not/a/relative/url")
expect(@profile.public_send(method)).to eq("http://not/a/relative/url")
end
it "saves the default-url as nil" do
@profile.public_send("#{method}=", "/assets/user/default.png")
expect(@profile[method]).to be_nil
end
end
end
end
describe '#image_url' do
before do
@profile = FactoryGirl.build(:profile)
end
it 'returns a default rather than nil' do
@profile.image_url = nil
expect(@profile.image_url).not_to be_nil
end
it 'falls back to the large thumbnail if the small thumbnail is nil' do
#Backwards compatibility
@profile[:image_url] = 'large'
@profile[:image_url_small] = nil
@profile[:image_url_medium] = nil
expect(@profile.image_url(:thumb_small)).to eq('large')
expect(@profile.image_url(:thumb_medium)).to eq('large')
end
end
describe '#subscribers' do
it 'returns all non-pending contacts for a user' do
expect(bob.profile.subscribers.map(&:id)).to match_array([alice.person, eve.person].map(&:id))
end
end
describe "public?" do
it "is public if public_details is true" do
profile = FactoryGirl.build(:profile, public_details: true)
expect(profile.public?).to be_truthy
end
it "is not public if public_details is false" do
profile = FactoryGirl.build(:profile, public_details: false)
expect(profile.public?).to be_falsey
end
end
describe 'date=' do
let(:profile) { FactoryGirl.build(:profile) }
it 'accepts form data' do
profile.birthday = nil
profile.date = { 'year' => '2000', 'month' => '01', 'day' => '01' }
expect(profile.birthday.year).to eq(2000)
expect(profile.birthday.month).to eq(1)
expect(profile.birthday.day).to eq(1)
end
it 'unsets the birthday' do
profile.birthday = Date.new(2000, 1, 1)
profile.date = { 'year' => '', 'month' => '', 'day' => ''}
expect(profile.birthday).to eq(nil)
end
it 'does not change with blank month and day values' do
profile.birthday = Date.new(2000, 1, 1)
profile.date = { 'year' => '2001', 'month' => '', 'day' => ''}
expect(profile.birthday.year).to eq(2000)
expect(profile.birthday.month).to eq(1)
expect(profile.birthday.day).to eq(1)
end
it 'does not accept blank initial values' do
profile.birthday = nil
profile.date = { 'year' => '2001', 'month' => '', 'day' => ''}
expect(profile.birthday).to eq(nil)
end
it 'does not accept invalid dates' do
profile.birthday = nil
profile.date = { 'year' => '2001', 'month' => '02', 'day' => '31' }
expect(profile.birthday).to eq(nil)
end
it 'does not change with invalid dates' do
profile.birthday = Date.new(2000, 1, 1)
profile.date = { 'year' => '2001', 'month' => '02', 'day' => '31' }
expect(profile.birthday.year).to eq(2000)
expect(profile.birthday.month).to eq(1)
expect(profile.birthday.day).to eq(1)
end
end
describe 'tags' do
before do
person = FactoryGirl.build(:person)
@object = person.profile
end
it 'allows 5 tags' do
@object.tag_string = '#one #two #three #four #five'
@object.valid?
@object.errors.full_messages
expect(@object).to be_valid
end
it 'strips more than 5 tags' do
@object.tag_string = '#one #two #three #four #five #six'
@object.save
expect(@object.tags.count).to eq(5)
end
it 'should require tag name not be more than 255 characters long' do
@object.tag_string = "##{'a' * (255+1)}"
@object.save
expect(@object).not_to be_valid
end
it_should_behave_like 'it is taggable'
end
describe "#tombstone!" do
before do
@profile = bob.person.profile
end
it "clears the profile fields" do
attributes = @profile.send(:clearable_fields)
@profile.tombstone!
@profile.reload
attributes.each{ |attr|
expect(@profile[attr.to_sym]).to be_blank
}
end
it 'removes all the tags from the profile' do
expect(@profile.taggings).to receive(:delete_all)
@profile.tombstone!
end
it "doesn't recreate taggings if tag string was requested" do
@profile.tag_string
@profile.tombstone!
expect(@profile.taggings).to be_empty
end
end
describe "#clearable_fields" do
it 'returns the current profile fields' do
profile = FactoryGirl.build :profile
expect(profile.send(:clearable_fields).sort).to eq(
["diaspora_handle",
"first_name",
"last_name",
"image_url",
"image_url_small",
"image_url_medium",
"birthday",
"gender",
"bio",
"searchable",
"nsfw",
"location",
"public_details",
"full_name"].sort
)
end
end
end