356 lines
11 KiB
Ruby
356 lines
11 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# 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 = FactoryBot.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 = FactoryBot.build(:profile, first_name: "Hexagoooooooooooooooooooooooooon")
|
|
expect(profile).to be_valid
|
|
end
|
|
|
|
it "cannot be 33 characters" do
|
|
profile = FactoryBot.build(:profile, first_name: "Hexagooooooooooooooooooooooooooon")
|
|
expect(profile).not_to be_valid
|
|
end
|
|
|
|
it "cannot have ;" do
|
|
profile = FactoryBot.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 = FactoryBot.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 = FactoryBot.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 = FactoryBot.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 = FactoryBot.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 = FactoryBot.build(:profile, last_name: "Hexagoooooooooooooooooooooooooon")
|
|
expect(profile).to be_valid
|
|
end
|
|
|
|
it "cannot be 33 characters" do
|
|
profile = FactoryBot.build(:profile, last_name: "Hexagooooooooooooooooooooooooooon")
|
|
expect(profile).not_to be_valid
|
|
end
|
|
|
|
it "cannot have ;" do
|
|
profile = FactoryBot.build(:profile, last_name: "Hex;agon")
|
|
expect(profile).not_to be_valid
|
|
end
|
|
it "disallows ; with a newline in the string" do
|
|
profile = FactoryBot.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 = FactoryBot.build(:profile, location: "a" * 255)
|
|
expect(profile).to be_valid
|
|
end
|
|
|
|
it "cannot be 256 characters" do
|
|
profile = FactoryBot.build(:profile, location: "a" * 256)
|
|
expect(profile).not_to be_valid
|
|
end
|
|
end
|
|
|
|
describe "of gender" do
|
|
it "can be 255 characters long" do
|
|
profile = FactoryBot.build(:profile, gender: "a" * 255)
|
|
expect(profile).to be_valid
|
|
end
|
|
|
|
it "cannot be 256 characters" do
|
|
profile = FactoryBot.build(:profile, gender: "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 = FactoryBot.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 = FactoryBot.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(size: :thumb_small)).to eq("large")
|
|
expect(@profile.image_url(size: :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 = FactoryBot.build(:profile, public_details: true)
|
|
expect(profile.public?).to be_truthy
|
|
end
|
|
|
|
it "is not public if public_details is false" do
|
|
profile = FactoryBot.build(:profile, public_details: false)
|
|
expect(profile.public?).to be_falsey
|
|
end
|
|
end
|
|
|
|
describe "date=" do
|
|
let(:profile) { FactoryBot.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
|
|
let(:object) { FactoryBot.build(:person).profile }
|
|
|
|
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 "keeps the order of the tag_string" do
|
|
ActsAsTaggableOn::Tag.create(name: "test2")
|
|
ActsAsTaggableOn::Tag.create(name: "test1")
|
|
|
|
string = "#test1 #test2"
|
|
object.tag_string = string
|
|
object.save
|
|
|
|
expect(Profile.find(object.id).tag_string).to eq(string)
|
|
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 = FactoryBot.build :profile
|
|
expect(profile.send(:clearable_fields).sort).to eq(
|
|
%w[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
|