discourse/spec/services/destroy_task_spec.rb
Blake Erickson 092eeb5ca3 FEATURE: Create a rake task for destroying categories
Created a rake task for destroying multiple categories along with any
subcategories and topics the belong to those categories.

Also created a rake task for listing all of your categories.

Refactored existing destroy rake tasks to use new logging method, that
allows for puts output in the console but prevents it from showing in
the specs.
2019-07-17 12:44:14 -06:00

121 lines
3.7 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe DestroyTask do
describe 'destroy topics' do
fab!(:c) { Fabricate(:category) }
fab!(:t) { Fabricate(:topic, category: c) }
let!(:p) { Fabricate(:post, topic: t) }
fab!(:c2) { Fabricate(:category) }
fab!(:t2) { Fabricate(:topic, category: c2) }
let!(:p2) { Fabricate(:post, topic: t2) }
fab!(:sc) { Fabricate(:category, parent_category: c2) }
fab!(:t3) { Fabricate(:topic, category: sc) }
let!(:p3) { Fabricate(:post, topic: t3) }
it 'destroys all topics in a category' do
destroy_task = DestroyTask.new(StringIO.new)
expect { destroy_task.destroy_topics(c.slug) }
.to change { Topic.where(category_id: c.id).count }.by (-1)
end
it 'destroys all topics in a sub category' do
destroy_task = DestroyTask.new(StringIO.new)
expect { destroy_task.destroy_topics(sc.slug, c2.slug) }
.to change { Topic.where(category_id: sc.id).count }.by(-1)
end
it "doesn't destroy system topics" do
destroy_task = DestroyTask.new(StringIO.new)
destroy_task.destroy_topics(c2.slug)
expect(Topic.where(category_id: c2.id).count).to eq 1
end
it 'destroys topics in all categories' do
destroy_task = DestroyTask.new(StringIO.new)
destroy_task.destroy_topics_all_categories
expect(Post.where(topic_id: [t.id, t2.id, t3.id]).count).to eq 0
end
end
describe 'destroy categories' do
fab!(:c) { Fabricate(:category) }
fab!(:t) { Fabricate(:topic, category: c) }
let!(:p) { Fabricate(:post, topic: t) }
fab!(:c2) { Fabricate(:category) }
fab!(:t2) { Fabricate(:topic, category: c) }
let!(:p2) { Fabricate(:post, topic: t2) }
fab!(:sc) { Fabricate(:category, parent_category: c2) }
fab!(:t3) { Fabricate(:topic, category: sc) }
let!(:p3) { Fabricate(:post, topic: t3) }
it 'destroys specified category' do
destroy_task = DestroyTask.new(StringIO.new)
expect { destroy_task.destroy_category(c.id) }
.to change { Category.where(id: c.id).count }.by (-1)
end
it 'destroys sub-categories when destroying parent category' do
destroy_task = DestroyTask.new(StringIO.new)
expect { destroy_task.destroy_category(c2.id) }
.to change { Category.where(id: sc.id).count }.by (-1)
end
end
describe 'private messages' do
let!(:pm) { Fabricate(:private_message_post) }
let!(:pm2) { Fabricate(:private_message_post) }
it 'destroys all private messages' do
destroy_task = DestroyTask.new(StringIO.new)
destroy_task.destroy_private_messages
expect(Topic.where(archetype: "private_message").count).to eq 0
end
end
describe 'groups' do
let!(:g) { Fabricate(:group) }
let!(:g2) { Fabricate(:group) }
it 'destroys all groups' do
destroy_task = DestroyTask.new(StringIO.new)
destroy_task.destroy_groups
expect(Group.where(automatic: false).count).to eq 0
end
it "doesn't destroy default groups" do
destroy_task = DestroyTask.new(StringIO.new)
before_count = Group.count
destroy_task.destroy_groups
expect(Group.count).to eq before_count - 2
end
end
describe 'users' do
it 'destroys all non-admin users' do
before_count = User.count
Fabricate(:user)
Fabricate(:user)
Fabricate(:admin)
destroy_task = DestroyTask.new(StringIO.new)
destroy_task.destroy_users
expect(User.where(admin: false).count).to eq 0
# admin does not get detroyed
expect(User.count).to eq before_count + 1
end
end
describe 'stats' do
it 'destroys all site stats' do
destroy_task = DestroyTask.new(StringIO.new)
destroy_task.destroy_stats
end
end
end