# encoding: utf-8 require 'spec_helper' require_dependency 'post_creator' describe Category do it { is_expected.to validate_presence_of :user_id } it { is_expected.to validate_presence_of :name } it 'validates uniqueness of name' do Fabricate(:category) is_expected.to validate_uniqueness_of(:name).scoped_to(:parent_category_id) end it 'validates uniqueness in case insensitive way' do Fabricate(:category, name: "Cats") cats = Fabricate.build(:category, name: "cats") expect(cats).to_not be_valid expect(cats.errors[:name]).to be_present end describe "last_updated_at" do it "returns a number value of when the category was last updated" do last = Category.last_updated_at expect(last).to be_present expect(last.to_i).to eq(last) end end describe "resolve_permissions" do it "can determine read_restricted" do read_restricted, resolved = Category.resolve_permissions(:everyone => :full) expect(read_restricted).to be false expect(resolved).to be_blank end end describe "topic_create_allowed and post_create_allowed" do it "works" do # NOTE we also have the uncategorized category ... hence the increased count _default_category = Fabricate(:category) full_category = Fabricate(:category) can_post_category = Fabricate(:category) can_read_category = Fabricate(:category) user = Fabricate(:user) group = Fabricate(:group) group.add(user) group.save admin = Fabricate(:admin) full_category.set_permissions(group => :full) full_category.save can_post_category.set_permissions(group => :create_post) can_post_category.save can_read_category.set_permissions(group => :readonly) can_read_category.save guardian = Guardian.new(admin) expect(Category.topic_create_allowed(guardian).count).to be(5) expect(Category.post_create_allowed(guardian).count).to be(5) expect(Category.secured(guardian).count).to be(5) guardian = Guardian.new(user) expect(Category.secured(guardian).count).to be(5) expect(Category.post_create_allowed(guardian).count).to be(4) expect(Category.topic_create_allowed(guardian).count).to be(3) # explicitly allowed once, default allowed once # everyone has special semantics, test it as well can_post_category.set_permissions(:everyone => :create_post) can_post_category.save expect(Category.post_create_allowed(guardian).count).to be(4) # anonymous has permission to create no topics guardian = Guardian.new(nil) expect(Category.post_create_allowed(guardian).count).to be(0) end end describe "security" do let(:category) { Fabricate(:category) } let(:category_2) { Fabricate(:category) } let(:user) { Fabricate(:user) } let(:group) { Fabricate(:group) } it "secures categories correctly" do expect(category.read_restricted?).to be false category.set_permissions({}) expect(category.read_restricted?).to be true category.set_permissions(:everyone => :full) expect(category.read_restricted?).to be false expect(user.secure_categories).to be_empty group.add(user) group.save category.set_permissions(group.id => :full) category.save user.reload expect(user.secure_categories).to eq([category]) end it "lists all secured categories correctly" do uncategorized = Category.find(SiteSetting.uncategorized_category_id) group.add(user) category.set_permissions(group.id => :full) category.save category_2.set_permissions(group.id => :full) category_2.save expect(Category.secured).to match_array([uncategorized]) expect(Category.secured(Guardian.new(user))).to match_array([uncategorized,category, category_2]) end end it "strips leading blanks" do expect(Fabricate(:category, name: " music").name).to eq("music") end it "strips trailing blanks" do expect(Fabricate(:category, name: "bugs ").name).to eq("bugs") end it "strips leading and trailing blanks" do expect(Fabricate(:category, name: " blanks ").name).to eq("blanks") end it "sets name_lower" do expect(Fabricate(:category, name: "Not MySQL").name_lower).to eq("not mysql") end it "has custom fields" do category = Fabricate(:category, name: " music") expect(category.custom_fields["a"]).to be_nil category.custom_fields["bob"] = "marley" category.custom_fields["jack"] = "black" category.save category = Category.find(category.id) expect(category.custom_fields).to eq({"bob" => "marley", "jack" => "black"}) end describe "short name" do let!(:category) { Fabricate(:category, name: 'xx') } it "creates the category" do expect(category).to be_present end it 'has one topic' do expect(Topic.where(category_id: category.id).count).to eq(1) end end describe 'non-english characters' do let(:category) { Fabricate(:category, name: "测试") } it "creates a blank slug, this is OK." do expect(category.slug).to be_blank expect(category.slug_for_url).to eq("#{category.id}-category") end it "creates a localized slug if default locale is zh_CN" do SiteSetting.default_locale = 'zh_CN' expect(category.slug).to_not be_blank expect(category.slug_for_url).to eq("ce-shi") end end describe 'slug would be a number' do let(:category) { Fabricate(:category, name: "2") } it 'creates a blank slug' do expect(category.slug).to be_blank expect(category.slug_for_url).to eq("#{category.id}-category") end end describe 'custom slug can be provided' do it 'has the custom value' do c = Fabricate(:category, name: "Cats", slug: "cats-category") expect(c.slug).to eq("cats-category") end it 'and be sanitized' do c = Fabricate(:category, name: 'Cats', slug: ' invalid slug') c.slug.should == 'invalid-slug' end it 'fails if custom slug is duplicate with existing' do c1 = Fabricate(:category, name: "Cats", slug: "cats") c2 = Fabricate.build(:category, name: "More Cats", slug: "cats") expect(c2).to_not be_valid expect(c2.errors[:slug]).to be_present end end describe 'description_text' do it 'correctly generates text description as needed' do c = Category.new expect(c.description_text).to be_nil c.description = "<hello test." expect(c.description_text).to eq("