spree_redirects 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +7 -0
- data/Gemfile +2 -0
- data/LICENSE +23 -0
- data/README.md +98 -0
- data/Rakefile +21 -0
- data/app/controllers/admin/redirects_controller.rb +16 -0
- data/app/models/redirect.rb +24 -0
- data/app/views/admin/redirects/_form.html.erb +11 -0
- data/app/views/admin/redirects/edit.html.erb +10 -0
- data/app/views/admin/redirects/index.html.erb +37 -0
- data/app/views/admin/redirects/new.html.erb +13 -0
- data/app/views/admin/shared/_redirect_config.html.erb +4 -0
- data/config/locales/en.yml +7 -0
- data/config/routes.rb +7 -0
- data/lib/dummy_hooks/after_migrate.rb.sample +1 -0
- data/lib/dummy_hooks/before_migrate.rb +2 -0
- data/lib/generators/spree_redirects/install_generator.rb +30 -0
- data/lib/generators/templates/db/migrate/create_redirects.rb +15 -0
- data/lib/spree_redirects.rb +17 -0
- data/lib/spree_redirects/custom_hooks.rb +7 -0
- data/lib/spree_redirects/redirect_middleware.rb +28 -0
- data/lib/spree_redirects/version.rb +3 -0
- data/spree_redirects.gemspec +34 -0
- data/test/integration/admin_redirects_test.rb +77 -0
- data/test/integration/redirect_middleware_test.rb +21 -0
- data/test/support/fixtures.rb +22 -0
- data/test/support/helper_methods.rb +11 -0
- data/test/support/integration_case.rb +26 -0
- data/test/test_helper.rb +33 -0
- data/test/unit/redirect_test.rb +66 -0
- metadata +185 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Redistribution and use in source and binary forms, with or without modification,
|
2
|
+
are permitted provided that the following conditions are met:
|
3
|
+
|
4
|
+
* Redistributions of source code must retain the above copyright notice,
|
5
|
+
this list of conditions and the following disclaimer.
|
6
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
7
|
+
this list of conditions and the following disclaimer in the documentation
|
8
|
+
and/or other materials provided with the distribution.
|
9
|
+
* Neither the name of the Rails Dog LLC nor the names of its
|
10
|
+
contributors may be used to endorse or promote products derived from this
|
11
|
+
software without specific prior written permission.
|
12
|
+
|
13
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
14
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
15
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
16
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
17
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
18
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
19
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
20
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
21
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
22
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
23
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
Spree Redirects
|
2
|
+
===============
|
3
|
+
|
4
|
+
Spree Redirects adds an interface for redirecting old urls to new ones. It's for when you replace an existing site with a shiny new spree site and want to avoid broken links and broken hearts.
|
5
|
+
|
6
|
+
To get a better idea of what it does, just follow the Demo instructions below...
|
7
|
+
|
8
|
+
|
9
|
+
Installation
|
10
|
+
------------
|
11
|
+
|
12
|
+
Install spree_redirects by adding the following to your existing spree site's Gemfile:
|
13
|
+
|
14
|
+
gem 'spree_redirects', :git => 'git://github.com/citrus/spree_redirects.git'
|
15
|
+
|
16
|
+
Now bundle up:
|
17
|
+
|
18
|
+
bundle
|
19
|
+
|
20
|
+
Then run the generator which copies the migration template into your project:
|
21
|
+
|
22
|
+
rails g spree_redirects:install
|
23
|
+
|
24
|
+
Migrate your database:
|
25
|
+
|
26
|
+
rake db:migrate
|
27
|
+
|
28
|
+
And reboot your server:
|
29
|
+
|
30
|
+
rails s
|
31
|
+
|
32
|
+
|
33
|
+
You should be up and running now!
|
34
|
+
|
35
|
+
|
36
|
+
Testing
|
37
|
+
-------
|
38
|
+
|
39
|
+
Clone this repo to where you develop, bundle up and run dummier to get the show started:
|
40
|
+
|
41
|
+
git clone git://github.com/citrus/spree_redirects.git
|
42
|
+
cd spree_redirects
|
43
|
+
bundle install
|
44
|
+
bundle exec dummier
|
45
|
+
|
46
|
+
This will generate a fresh rails app in `test/dummy`, install spree_core & spree_redirects, then migrate the test database. Sweet.
|
47
|
+
|
48
|
+
|
49
|
+
### If you'd like to use Spork
|
50
|
+
|
51
|
+
Boot the drb server with:
|
52
|
+
|
53
|
+
bundle exec spork
|
54
|
+
|
55
|
+
In another window, run all tests:
|
56
|
+
|
57
|
+
testdrb test/**/*_test.rb
|
58
|
+
|
59
|
+
Or just a specific test:
|
60
|
+
|
61
|
+
testdrb test/unit/redirect_test.rb
|
62
|
+
|
63
|
+
|
64
|
+
### No Spork
|
65
|
+
|
66
|
+
If you don't want to spork, just use rake:
|
67
|
+
|
68
|
+
rake
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
Demo
|
74
|
+
----
|
75
|
+
|
76
|
+
You can easily use the test/dummy app as a demo of spree_redirects. Just `cd` to where you develop and run:
|
77
|
+
|
78
|
+
git clone git://github.com/citrus/spree_redirects.git
|
79
|
+
cd spree_redirects
|
80
|
+
mv lib/dummy_hooks/after_migrate.rb.sample lib/dummy_hooks/after_migrate.rb
|
81
|
+
bundle install
|
82
|
+
bundle exec dummier
|
83
|
+
cd test/dummy
|
84
|
+
rails s
|
85
|
+
|
86
|
+
|
87
|
+
Contributors
|
88
|
+
------------
|
89
|
+
|
90
|
+
So far it's just me; Spencer Steffen.
|
91
|
+
|
92
|
+
If you'd like to help out feel free to fork and send me pull requests!
|
93
|
+
|
94
|
+
|
95
|
+
License
|
96
|
+
-------
|
97
|
+
|
98
|
+
Copyright (c) 2011 Spencer Steffen and Citrus, released under the New BSD License All rights reserved.
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'rubygems'
|
3
|
+
begin
|
4
|
+
require 'bundler/setup'
|
5
|
+
rescue LoadError
|
6
|
+
puts 'You must run `gem install bundler` and `bundle install` to run rake tasks'
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'rake'
|
10
|
+
require 'rake/testtask'
|
11
|
+
|
12
|
+
Bundler::GemHelper.install_tasks
|
13
|
+
|
14
|
+
Rake::TestTask.new(:test) do |t|
|
15
|
+
t.libs << 'lib'
|
16
|
+
t.libs << 'test'
|
17
|
+
t.pattern = 'test/**/*_test.rb'
|
18
|
+
t.verbose = false
|
19
|
+
end
|
20
|
+
|
21
|
+
task :default => :test
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Admin::RedirectsController < Admin::ResourceController
|
2
|
+
|
3
|
+
def new
|
4
|
+
@redirect = Redirect.new
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def collection
|
10
|
+
params[:search] ||= {}
|
11
|
+
params[:search][:meta_sort] ||= "old_url.asc"
|
12
|
+
@search = Redirect.search(params[:search])
|
13
|
+
@collection = @search.paginate(:per_page => Spree::Config[:orders_per_page], :page => params[:page])
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Redirect < ActiveRecord::Base
|
2
|
+
|
3
|
+
validates :old_url, :presence => true, :uniqueness => { :case_sensitive => false }
|
4
|
+
validates :new_url, :presence => true
|
5
|
+
validate :validate_urls
|
6
|
+
|
7
|
+
before_validation :normalize_urls
|
8
|
+
|
9
|
+
def normalize_urls
|
10
|
+
[ :old_url, :new_url ].map{|attribute| write_attribute attribute, normalize_url(send attribute) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate_urls
|
14
|
+
errors.add(:base, I18n.t('duplicate_url_error')) if old_url == new_url
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def normalize_url(url)
|
20
|
+
return url if url.blank?
|
21
|
+
url.to_s.downcase.sub!(/^[\/\s]*/, '/').strip
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%= form.field_container :old_url do %>
|
2
|
+
<%= form.label :old_url, t('old_url') %><br />
|
3
|
+
<%= form.text_field :old_url, :class => 'text' %>
|
4
|
+
<%= error_message_on :redirect, :old_url %>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<%= form.field_container :new_url do %>
|
8
|
+
<%= form.label :new_url, t('new_url') %><br />
|
9
|
+
<%= form.text_field :new_url, :class => 'text' %>
|
10
|
+
<%= error_message_on :redirect, :new_url %>
|
11
|
+
<% end %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<%= render :partial => 'admin/shared/configuration_menu' %>
|
2
|
+
|
3
|
+
<%= render 'shared/error_messages', :target => @redirect %>
|
4
|
+
|
5
|
+
<%= form_for([:admin, @redirect]) do |f| %>
|
6
|
+
<%= render "form", :form => f %>
|
7
|
+
<p class="form-buttons">
|
8
|
+
<%= button t("update") %> <%= t('or') %> <%= link_to t('cancel'), collection_url %>
|
9
|
+
</p>
|
10
|
+
<% end %>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<%= render :partial => 'admin/shared/configuration_menu' %>
|
2
|
+
|
3
|
+
<div class='toolbar'>
|
4
|
+
<ul class='actions'>
|
5
|
+
<li>
|
6
|
+
<p><%= button_link_to "New Redirect", new_object_url, :icon => 'add' %></p>
|
7
|
+
</li>
|
8
|
+
</ul>
|
9
|
+
<br class='clear' />
|
10
|
+
</div>
|
11
|
+
|
12
|
+
|
13
|
+
<h1>Listing Redirects</h1>
|
14
|
+
|
15
|
+
<table class="index">
|
16
|
+
<thead>
|
17
|
+
<tr>
|
18
|
+
<th><%= sort_link @search, :old_url, t('redirect.old_url') %></th>
|
19
|
+
<th><%= sort_link @search, :new_url, t('redirect.new_url') %></th>
|
20
|
+
<th><%= t('action') %></th>
|
21
|
+
</tr>
|
22
|
+
</thead>
|
23
|
+
<tbody>
|
24
|
+
<%- @collection.each do |redirect|%>
|
25
|
+
<tr id="<%= dom_id redirect %>">
|
26
|
+
<td><%= redirect.old_url %></td>
|
27
|
+
<td><%= redirect.new_url %></td>
|
28
|
+
<td>
|
29
|
+
<%= link_to_edit redirect %>
|
30
|
+
<%= link_to_delete redirect %>
|
31
|
+
</td>
|
32
|
+
</tr>
|
33
|
+
<% end %>
|
34
|
+
</tbody>
|
35
|
+
</table>
|
36
|
+
|
37
|
+
<%= will_paginate(:prev => "« #{t('previous')}", :next => "#{t('next')} »") %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= render :partial => 'admin/shared/configuration_menu' %>
|
2
|
+
|
3
|
+
<h1><%= t '.new_redirect' %></h1>
|
4
|
+
|
5
|
+
<%= render 'shared/error_messages', :target => @redirect %>
|
6
|
+
|
7
|
+
<%= form_for([:admin, @redirect]) do |f| %>
|
8
|
+
<%= render "form", :form => f %>
|
9
|
+
<p class="form-buttons">
|
10
|
+
<%= button t('create') %> <%= t('or') %> <%= link_to t('cancel'), collection_url %>
|
11
|
+
</p>
|
12
|
+
<% end %>
|
13
|
+
|
data/config/routes.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rake "db:migrate db:seed db:admin:create", :env => "development"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module SpreeRedirects
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
|
7
|
+
def self.count!
|
8
|
+
@count ||= 0
|
9
|
+
(@count += 1) * 3
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.next_migration_number(path)
|
13
|
+
@time ||= Time.new.utc
|
14
|
+
if ActiveRecord::Base.timestamped_migrations
|
15
|
+
(@time + self.count!).strftime("%Y%m%d%H%M%S")
|
16
|
+
else
|
17
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Installs required migrations for spree_essentials"
|
22
|
+
source_root File.expand_path("../../templates", __FILE__)
|
23
|
+
|
24
|
+
def copy_migrations
|
25
|
+
migration_template "db/migrate/create_redirects.rb", "db/migrate/create_redirects.rb"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spree_core'
|
2
|
+
require 'spree_redirects/custom_hooks'
|
3
|
+
require 'spree_redirects/redirect_middleware'
|
4
|
+
|
5
|
+
module SpreeRedirects
|
6
|
+
|
7
|
+
class Engine < Rails::Engine
|
8
|
+
|
9
|
+
config.autoload_paths += %W(#{config.root}/lib)
|
10
|
+
|
11
|
+
initializer "redirect middleware" do |app|
|
12
|
+
app.middleware.insert_before ::Rack::Lock, ::SpreeRedirects::RedirectMiddleware
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module SpreeRedirects
|
2
|
+
class RedirectMiddleware
|
3
|
+
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
# execute the request using our Rails app
|
10
|
+
status, headers, body = @app.call(env)
|
11
|
+
|
12
|
+
if status == 404 && url = find_redirect([ env['PATH_INFO'], env['QUERY_STRING'] ].join("?").sub(/[\?\s]*$/, '').strip)
|
13
|
+
# Issue a "Moved permanently" response with the redirect location
|
14
|
+
[ 301, { "Location" => url }, 'Redirecting you to the new location...' ]
|
15
|
+
else
|
16
|
+
# Not a 404 or no redirect found, just send the response as is
|
17
|
+
[ status, headers, body ]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_redirect(url)
|
22
|
+
redirect = Redirect.find_by_old_url(url) rescue nil
|
23
|
+
return if redirect.nil?
|
24
|
+
redirect.new_url
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "spree_redirects/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "spree_redirects"
|
7
|
+
s.version = SpreeRedirects::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Spencer Steffen"]
|
10
|
+
s.email = ["spencer@citrusme.com"]
|
11
|
+
s.homepage = "https://github.com/citrus/spree_redirects"
|
12
|
+
s.summary = %q{Spree Redirects adds an interface for redirecting old url's to new ones.}
|
13
|
+
s.description = %q{Spree Redirects adds an interface for redirecting old url's to new ones.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "spree_redirects"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
# Spree
|
23
|
+
s.add_dependency('spree_core', '>= 0.60.0')
|
24
|
+
|
25
|
+
# Development
|
26
|
+
s.add_development_dependency('dummier', '>= 0.1.0')
|
27
|
+
s.add_development_dependency('shoulda', '>= 2.11.3')
|
28
|
+
s.add_development_dependency('spork', '>= 0.9.0.rc8')
|
29
|
+
s.add_development_dependency('spork-testunit', '>= 0.0.5')
|
30
|
+
s.add_development_dependency('factory_girl', '>= 2.0.0.beta2')
|
31
|
+
s.add_development_dependency('capybara', '>= 0.4.1')
|
32
|
+
s.add_development_dependency('sqlite3', '>= 1.3.3')
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class AdminRedirectsTest < ActiveSupport::IntegrationCase
|
4
|
+
|
5
|
+
setup do
|
6
|
+
Redirect.destroy_all
|
7
|
+
@labels = %(Old URL, New URL).split(', ')
|
8
|
+
@values = %(booboo, woohoo).split(', ')
|
9
|
+
end
|
10
|
+
|
11
|
+
should "have a link to redirects from config page" do
|
12
|
+
visit admin_configurations_path
|
13
|
+
assert has_link?("Manage Redirects")
|
14
|
+
end
|
15
|
+
|
16
|
+
should "have a link to new redirect" do
|
17
|
+
visit admin_redirects_path
|
18
|
+
btn = find(".actions a.button").native
|
19
|
+
assert_match /#{new_admin_redirect_path}$/, btn.attribute('href')
|
20
|
+
assert_equal "New Redirect", btn.text
|
21
|
+
end
|
22
|
+
|
23
|
+
should "get new redirect" do
|
24
|
+
visit new_admin_redirect_path
|
25
|
+
assert has_content?("New Redirect")
|
26
|
+
within "#new_redirect" do
|
27
|
+
@labels.each do |f|
|
28
|
+
assert has_field?(f)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
should "validate redirect" do
|
34
|
+
visit new_admin_redirect_path
|
35
|
+
click_button "Create"
|
36
|
+
within "#errorExplanation" do
|
37
|
+
assert_seen "3 errors prohibited this record from being saved:"
|
38
|
+
assert_seen "Old url can't be blank"
|
39
|
+
assert_seen "New url can't be blank"
|
40
|
+
assert_seen "The old URL may not be the same as the new URL."
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
should "create a redirect" do
|
45
|
+
visit new_admin_redirect_path
|
46
|
+
within "#new_redirect" do
|
47
|
+
@labels.each_with_index do |label, index|
|
48
|
+
fill_in label, :with => @values[index]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
click_button "Create"
|
52
|
+
assert_flash(:notice, "Redirect has been successfully created!")
|
53
|
+
end
|
54
|
+
|
55
|
+
context "an existing redirect" do
|
56
|
+
setup do
|
57
|
+
@redirect = Redirect.create(:old_url => "booboo", :new_url => "woohoo")
|
58
|
+
end
|
59
|
+
|
60
|
+
should "update redirect, user and addresses" do
|
61
|
+
visit edit_admin_redirect_path(@redirect)
|
62
|
+
|
63
|
+
within "#edit_redirect_#{@redirect.id}" do
|
64
|
+
@labels.each_with_index do |label, index|
|
65
|
+
fill_in label, :with => @values[index].reverse
|
66
|
+
end
|
67
|
+
end
|
68
|
+
click_button "Update"
|
69
|
+
assert_equal admin_redirects_path, current_path
|
70
|
+
assert_flash(:notice, "Redirect has been successfully updated!")
|
71
|
+
assert_seen "/ooboob", :within => "tr#redirect_#{@redirect.id} td:first-child"
|
72
|
+
assert_seen "/oohoow", :within => "tr#redirect_#{@redirect.id} td:nth-child(2)"
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class AdminRedirectsTest < ActiveSupport::IntegrationCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
Redirect.destroy_all
|
7
|
+
@redirect = Redirect.create(:old_url => "shop-online.html", :new_url => "products")
|
8
|
+
end
|
9
|
+
|
10
|
+
should "redirect with simple url" do
|
11
|
+
visit @redirect.old_url
|
12
|
+
assert_equal current_path, @redirect.new_url
|
13
|
+
end
|
14
|
+
|
15
|
+
should "redirect with a query string" do
|
16
|
+
assert @redirect.update_attributes(:old_url => "shop?online=true&something=nothing")
|
17
|
+
visit @redirect.old_url
|
18
|
+
assert_equal current_path, @redirect.new_url
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
begin
|
2
|
+
|
3
|
+
FactoryGirl.define do
|
4
|
+
|
5
|
+
factory :user do
|
6
|
+
email { random_email }
|
7
|
+
password "spree123"
|
8
|
+
password_confirmation "spree123"
|
9
|
+
roles { [Role.find_or_create_by_name("user")] }
|
10
|
+
end
|
11
|
+
|
12
|
+
factory :admin_user, :parent => :user do
|
13
|
+
roles { [Role.find_or_create_by_name("admin")] }
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
rescue FactoryGirl::DuplicateDefinitionError
|
19
|
+
|
20
|
+
puts "factories are already defined..."
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Define a bare test case to use with Capybara
|
2
|
+
|
3
|
+
class ActiveSupport::IntegrationCase < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
include Capybara
|
6
|
+
include Rails.application.routes.url_helpers
|
7
|
+
|
8
|
+
self.use_transactional_fixtures = false
|
9
|
+
|
10
|
+
def assert_seen(text, opts={})
|
11
|
+
if opts[:within]
|
12
|
+
within(opts[:within]) do
|
13
|
+
assert has_content?(text)
|
14
|
+
end
|
15
|
+
else
|
16
|
+
assert has_content?(text)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def assert_flash(key, text)
|
21
|
+
within(".flash.#{key}") do
|
22
|
+
assert_seen(text)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Configure Rails Envinronment
|
2
|
+
ENV["RAILS_ENV"] = "test"
|
3
|
+
require 'spork'
|
4
|
+
|
5
|
+
Spork.prefork do
|
6
|
+
|
7
|
+
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
8
|
+
require "rails/test_help"
|
9
|
+
require "shoulda"
|
10
|
+
require "factory_girl"
|
11
|
+
require "sqlite3"
|
12
|
+
|
13
|
+
require "capybara/rails"
|
14
|
+
require "selenium/webdriver"
|
15
|
+
|
16
|
+
Rails.backtrace_cleaner.remove_silencers!
|
17
|
+
|
18
|
+
Capybara.default_driver = :selenium
|
19
|
+
Capybara.default_selector = :css
|
20
|
+
|
21
|
+
# Run any available migration if needed
|
22
|
+
ActiveRecord::Migrator.migrate File.expand_path("../dummy/db/migrate/", __FILE__)
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
Spork.each_run do
|
27
|
+
|
28
|
+
# Load support files
|
29
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| load f }
|
30
|
+
|
31
|
+
include HelperMethods
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class RedirectTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
Redirect.destroy_all
|
7
|
+
@redirect = Redirect.new
|
8
|
+
end
|
9
|
+
|
10
|
+
should "require urls to be set" do
|
11
|
+
assert !@redirect.valid?
|
12
|
+
assert !@redirect.save
|
13
|
+
assert @redirect.errors.include?(:old_url)
|
14
|
+
assert @redirect.errors.include?(:new_url)
|
15
|
+
end
|
16
|
+
|
17
|
+
should "not allow old to equal new" do
|
18
|
+
@redirect.old_url = @redirect.new_url = "omgomg"
|
19
|
+
assert !@redirect.valid?
|
20
|
+
assert !@redirect.save
|
21
|
+
assert @redirect.errors.include?(:base)
|
22
|
+
end
|
23
|
+
|
24
|
+
should "strip extra spaces" do
|
25
|
+
@redirect.attributes = { :old_url => " booboo ", :new_url => " woohoo " }
|
26
|
+
assert @redirect.save
|
27
|
+
assert_equal @redirect.old_url, "/booboo"
|
28
|
+
assert_equal @redirect.new_url, "/woohoo"
|
29
|
+
end
|
30
|
+
|
31
|
+
should "not duplicate starting slash" do
|
32
|
+
@redirect.attributes = { :old_url => "/booboo", :new_url => "/woohoo" }
|
33
|
+
assert @redirect.save
|
34
|
+
assert_equal @redirect.old_url, "/booboo"
|
35
|
+
assert_equal @redirect.new_url, "/woohoo"
|
36
|
+
end
|
37
|
+
|
38
|
+
should "remove multiple slashes" do
|
39
|
+
@redirect.attributes = { :old_url => "//booboo", :new_url => "////////woohoo" }
|
40
|
+
assert @redirect.save
|
41
|
+
assert_equal @redirect.old_url, "/booboo"
|
42
|
+
assert_equal @redirect.new_url, "/woohoo"
|
43
|
+
end
|
44
|
+
|
45
|
+
should "remove multiple slashes with spaces between" do
|
46
|
+
@redirect.attributes = { :old_url => "/ /booboo", :new_url => "// / / //woohoo" }
|
47
|
+
assert @redirect.save
|
48
|
+
assert_equal @redirect.old_url, "/booboo"
|
49
|
+
assert_equal @redirect.new_url, "/woohoo"
|
50
|
+
end
|
51
|
+
|
52
|
+
context "a url with proper attributes" do
|
53
|
+
|
54
|
+
setup do
|
55
|
+
@redirect.attributes = { :old_url => "booboo", :new_url => "woohoo" }
|
56
|
+
end
|
57
|
+
|
58
|
+
should "ensure starting slash" do
|
59
|
+
assert @redirect.save
|
60
|
+
assert_equal @redirect.old_url, "/booboo"
|
61
|
+
assert_equal @redirect.new_url, "/woohoo"
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
metadata
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spree_redirects
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Spencer Steffen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-06-02 00:00:00 -07:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: spree_core
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.60.0
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: dummier
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 0.1.0
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: shoulda
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.11.3
|
46
|
+
type: :development
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: spork
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 0.9.0.rc8
|
57
|
+
type: :development
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *id004
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: spork-testunit
|
62
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.0.5
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: *id005
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: factory_girl
|
73
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 2.0.0.beta2
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: *id006
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: capybara
|
84
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.4.1
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: *id007
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: sqlite3
|
95
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: 1.3.3
|
101
|
+
type: :development
|
102
|
+
prerelease: false
|
103
|
+
version_requirements: *id008
|
104
|
+
description: Spree Redirects adds an interface for redirecting old url's to new ones.
|
105
|
+
email:
|
106
|
+
- spencer@citrusme.com
|
107
|
+
executables: []
|
108
|
+
|
109
|
+
extensions: []
|
110
|
+
|
111
|
+
extra_rdoc_files: []
|
112
|
+
|
113
|
+
files:
|
114
|
+
- .gitignore
|
115
|
+
- Gemfile
|
116
|
+
- LICENSE
|
117
|
+
- README.md
|
118
|
+
- Rakefile
|
119
|
+
- app/controllers/admin/redirects_controller.rb
|
120
|
+
- app/models/redirect.rb
|
121
|
+
- app/views/admin/redirects/_form.html.erb
|
122
|
+
- app/views/admin/redirects/edit.html.erb
|
123
|
+
- app/views/admin/redirects/index.html.erb
|
124
|
+
- app/views/admin/redirects/new.html.erb
|
125
|
+
- app/views/admin/shared/_redirect_config.html.erb
|
126
|
+
- config/locales/en.yml
|
127
|
+
- config/routes.rb
|
128
|
+
- lib/dummy_hooks/after_migrate.rb.sample
|
129
|
+
- lib/dummy_hooks/before_migrate.rb
|
130
|
+
- lib/generators/spree_redirects/install_generator.rb
|
131
|
+
- lib/generators/templates/db/migrate/create_redirects.rb
|
132
|
+
- lib/spree_redirects.rb
|
133
|
+
- lib/spree_redirects/custom_hooks.rb
|
134
|
+
- lib/spree_redirects/redirect_middleware.rb
|
135
|
+
- lib/spree_redirects/version.rb
|
136
|
+
- spree_redirects.gemspec
|
137
|
+
- test/integration/admin_redirects_test.rb
|
138
|
+
- test/integration/redirect_middleware_test.rb
|
139
|
+
- test/support/fixtures.rb
|
140
|
+
- test/support/helper_methods.rb
|
141
|
+
- test/support/integration_case.rb
|
142
|
+
- test/test_helper.rb
|
143
|
+
- test/unit/redirect_test.rb
|
144
|
+
has_rdoc: true
|
145
|
+
homepage: https://github.com/citrus/spree_redirects
|
146
|
+
licenses: []
|
147
|
+
|
148
|
+
post_install_message:
|
149
|
+
rdoc_options: []
|
150
|
+
|
151
|
+
require_paths:
|
152
|
+
- lib
|
153
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
hash: 923679590247154286
|
159
|
+
segments:
|
160
|
+
- 0
|
161
|
+
version: "0"
|
162
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
|
+
none: false
|
164
|
+
requirements:
|
165
|
+
- - ">="
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
hash: 923679590247154286
|
168
|
+
segments:
|
169
|
+
- 0
|
170
|
+
version: "0"
|
171
|
+
requirements: []
|
172
|
+
|
173
|
+
rubyforge_project: spree_redirects
|
174
|
+
rubygems_version: 1.6.2
|
175
|
+
signing_key:
|
176
|
+
specification_version: 3
|
177
|
+
summary: Spree Redirects adds an interface for redirecting old url's to new ones.
|
178
|
+
test_files:
|
179
|
+
- test/integration/admin_redirects_test.rb
|
180
|
+
- test/integration/redirect_middleware_test.rb
|
181
|
+
- test/support/fixtures.rb
|
182
|
+
- test/support/helper_methods.rb
|
183
|
+
- test/support/integration_case.rb
|
184
|
+
- test/test_helper.rb
|
185
|
+
- test/unit/redirect_test.rb
|