Skip to content
This repository has been archived by the owner on Oct 12, 2018. It is now read-only.

Commit

Permalink
Merge pull request #24 from alphagov/artefact-slug-migrator
Browse files Browse the repository at this point in the history
Add artefact slug migrator task
  • Loading branch information
KushalP committed Oct 8, 2012
2 parents d0a2572 + cbfee22 commit 52fce0c
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 0 deletions.
3 changes: 3 additions & 0 deletions data/slugs_to_migrate.json
@@ -0,0 +1,3 @@
{

}
34 changes: 34 additions & 0 deletions lib/artefact_slug_migrator.rb
@@ -0,0 +1,34 @@
class ArtefactSlugMigrator

attr_reader :logger

def initialize(logger = nil)
@logger = logger || Logger.new(STDOUT)
end

def run
logger.info "Migrating slugs for #{slugs.size} artefacts"
slugs.each do |slug, new_slug|
artefact = Artefact.where(slug: slug).first
raise "Artefact not found with slug #{slug}" if artefact.nil?

rummageable_artefact = RummageableArtefact.new(artefact)
rummageable_artefact.delete

artefact.update_attribute(:slug, new_slug)

logger.info " #{slug} -> #{new_slug}"
end
logger.info "Sequence complete."
end

private
def slugs
@slugs ||= load_slugs
end

def load_slugs
json = File.open(Rails.root.join('data','slugs_to_migrate.json')).read
JSON.parse(json) || [ ]
end
end
8 changes: 8 additions & 0 deletions lib/tasks/artefact_slug_migrator.rake
@@ -0,0 +1,8 @@
require 'artefact_slug_migrator'

namespace :artefact_slug_migrator do
desc "Migrate the artefact slugs specified in data/slugs_to_migrate.json"
task :run => :environment do
ArtefactSlugMigrator.new.run
end
end
40 changes: 40 additions & 0 deletions test/unit/artefact_slug_migrator_test.rb
@@ -0,0 +1,40 @@
require 'test_helper'
require 'artefact_slug_migrator'

class ArtefactSlugMigratorTest < ActiveSupport::TestCase

setup do
# stub the observers for creating artefacts
UpdateRouterObserver.any_instance.stubs(:after_save)
UpdateSearchObserver.any_instance.stubs(:after_save)

@artefacts = [
FactoryGirl.create(:artefact, :slug => "first-original-slug"),
FactoryGirl.create(:artefact, :slug => "second-original-slug", :state => 'live'),
FactoryGirl.create(:artefact, :slug => "third-original-slug", :state => 'archived')
]

@it = ArtefactSlugMigrator.new( Logger.new("/dev/null") )

RummageableArtefact.any_instance.stubs(:delete).returns(true)
ArtefactSlugMigrator.any_instance.stubs(:slugs).returns({
"first-original-slug" => "first-new-slug",
"second-original-slug" => "second-new-slug",
"third-original-slug" => "third-new-slug"
})
end

should "remove artefact from search" do
RummageableArtefact.any_instance.expects(:delete).at_least_once.returns(true)

@it.run
end

should "update the slug in the artefact" do
@it.run

@artefacts.each(&:reload)
assert_equal ["first-new-slug", "second-new-slug", "third-new-slug"], @artefacts.map(&:slug)
end

end

0 comments on commit 52fce0c

Please sign in to comment.