mist 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/.travis.yml +13 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +192 -0
- data/README.md +108 -0
- data/Rakefile +9 -0
- data/app/assets/images/mist/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/app/assets/images/mist/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/app/assets/images/mist/ui-bg_flat_10_000000_40x100.png +0 -0
- data/app/assets/images/mist/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/app/assets/images/mist/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/app/assets/images/mist/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/app/assets/images/mist/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/app/assets/images/mist/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/app/assets/images/mist/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/app/assets/images/mist/ui-icons_222222_256x240.png +0 -0
- data/app/assets/images/mist/ui-icons_228ef1_256x240.png +0 -0
- data/app/assets/images/mist/ui-icons_ef8c08_256x240.png +0 -0
- data/app/assets/images/mist/ui-icons_ffd27a_256x240.png +0 -0
- data/app/assets/images/mist/ui-icons_ffffff_256x240.png +0 -0
- data/app/assets/javascripts/mist/jquery-ui-1.8.17.custom.min.js +356 -0
- data/app/assets/javascripts/mist/posts.js.coffee +3 -0
- data/app/assets/javascripts/mist_core.js +3 -0
- data/app/assets/stylesheets/mist/posts.css.sass +97 -0
- data/app/assets/stylesheets/mist/scaffolds.css.scss +56 -0
- data/app/assets/stylesheets/mist/ui-lightness/jquery-ui-1.8.17.custom.css +565 -0
- data/app/assets/stylesheets/mist_core.css +4 -0
- data/app/controllers/application_controller.rb +3 -0
- data/app/controllers/mist/posts_controller.rb +130 -0
- data/app/helpers/mist/posts_helper.rb +61 -0
- data/app/mailers/.gitkeep +0 -0
- data/app/models/.gitkeep +0 -0
- data/app/models/mist/post.rb +240 -0
- data/app/models/mist/post_sweeper.rb +63 -0
- data/app/views/layouts/mist/posts.html.erb +66 -0
- data/app/views/mist/posts/_form.html.erb +55 -0
- data/app/views/mist/posts/_post.html.erb +19 -0
- data/app/views/mist/posts/_sidebar_title.html.erb +5 -0
- data/app/views/mist/posts/edit.html.erb +16 -0
- data/app/views/mist/posts/feed.atom.builder +17 -0
- data/app/views/mist/posts/index.html.erb +31 -0
- data/app/views/mist/posts/new.html.erb +15 -0
- data/app/views/mist/posts/show.html.erb +3 -0
- data/config/cucumber.yml +8 -0
- data/config/environment.rb +1 -0
- data/config/routes.rb +7 -0
- data/features/atom_feed.feature +20 -0
- data/features/authorize_create_post.feature +14 -0
- data/features/authorize_destroy_post.feature +27 -0
- data/features/authorize_update_post.feature +28 -0
- data/features/authorize_view_unpublished.feature +22 -0
- data/features/create_post.feature +13 -0
- data/features/destroy_post.feature +13 -0
- data/features/format_with_markdown.feature +13 -0
- data/features/popular_posts.feature +35 -0
- data/features/recent_posts.feature +28 -0
- data/features/similar_posts.feature +43 -0
- data/features/step_definitions/authorization_steps.rb +17 -0
- data/features/step_definitions/filesystem_steps.rb +13 -0
- data/features/step_definitions/page_steps.rb +43 -0
- data/features/step_definitions/post_steps.rb +58 -0
- data/features/step_definitions/sidebar_steps.rb +21 -0
- data/features/support/env.rb +58 -0
- data/features/support/setup.rb +15 -0
- data/features/update_post.feature +19 -0
- data/gemfiles/common +20 -0
- data/gemfiles/rails-3.1.3 +4 -0
- data/gemfiles/rails-3.1.3.lock +195 -0
- data/gemfiles/rails-3.2.0 +4 -0
- data/lib/generators/mist/USAGE +13 -0
- data/lib/generators/mist/setup_generator.rb +21 -0
- data/lib/generators/mist/templates/initializer.rb +17 -0
- data/lib/generators/mist/templates/mist.css.scss +2 -0
- data/lib/generators/mist/templates/mist.js.coffee +1 -0
- data/lib/generators/mist/views_generator.rb +11 -0
- data/lib/mist.rb +26 -0
- data/lib/mist/code_example_parser.rb +86 -0
- data/lib/mist/configuration.rb +68 -0
- data/lib/mist/configuration/author.rb +8 -0
- data/lib/mist/engine.rb +12 -0
- data/lib/mist/git_file_system_history.rb +66 -0
- data/lib/mist/git_model.rb +154 -0
- data/lib/mist/git_model/attributes.rb +21 -0
- data/lib/mist/git_model/class_methods.rb +141 -0
- data/lib/mist/permalink.rb +5 -0
- data/lib/mist/repository.rb +15 -0
- data/lib/mist/version.rb +8 -0
- data/mist.gemspec +33 -0
- data/spec/controllers/posts_controller_spec.rb +263 -0
- data/spec/dummy_rails_app/app/assets/javascripts/mist.js.coffee +1 -0
- data/spec/dummy_rails_app/app/assets/stylesheets/mist.css.scss +2 -0
- data/spec/dummy_rails_app/app/views/layouts/mist/posts.html.erb +60 -0
- data/spec/dummy_rails_app/config.ru +4 -0
- data/spec/dummy_rails_app/config/application.rb +48 -0
- data/spec/dummy_rails_app/config/boot.rb +7 -0
- data/spec/dummy_rails_app/config/database.yml +28 -0
- data/spec/dummy_rails_app/config/environment.rb +5 -0
- data/spec/dummy_rails_app/config/environments/development.rb +32 -0
- data/spec/dummy_rails_app/config/environments/production.rb +60 -0
- data/spec/dummy_rails_app/config/environments/test.rb +42 -0
- data/spec/dummy_rails_app/config/initializers/active_gist_credentials.rb +8 -0
- data/spec/dummy_rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy_rails_app/config/initializers/inflections.rb +10 -0
- data/spec/dummy_rails_app/config/initializers/mime_types.rb +5 -0
- data/spec/dummy_rails_app/config/initializers/mist.rb +17 -0
- data/spec/dummy_rails_app/config/initializers/secret_token.rb +7 -0
- data/spec/dummy_rails_app/config/initializers/session_store.rb +8 -0
- data/spec/dummy_rails_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy_rails_app/config/locales/en.yml +5 -0
- data/spec/dummy_rails_app/config/routes.rb +3 -0
- data/spec/dummy_rails_app/db/schema.rb +22 -0
- data/spec/dummy_rails_app/db/seeds.rb +7 -0
- data/spec/dummy_rails_app/doc/README_FOR_APP +2 -0
- data/spec/dummy_rails_app/lib/assets/.gitkeep +0 -0
- data/spec/dummy_rails_app/lib/tasks/.gitkeep +0 -0
- data/spec/dummy_rails_app/lib/tasks/cucumber.rake +65 -0
- data/spec/dummy_rails_app/public/404.html +26 -0
- data/spec/dummy_rails_app/public/422.html +26 -0
- data/spec/dummy_rails_app/public/500.html +26 -0
- data/spec/dummy_rails_app/public/favicon.ico +0 -0
- data/spec/dummy_rails_app/public/robots.txt +5 -0
- data/spec/dummy_rails_app/script/cucumber +10 -0
- data/spec/dummy_rails_app/script/rails +6 -0
- data/spec/dummy_rails_app/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/dummy_rails_app/vendor/plugins/.gitkeep +0 -0
- data/spec/factories/posts.rb +8 -0
- data/spec/fixtures/gist_404 +6 -0
- data/spec/fixtures/gist_with_1_code_example +66 -0
- data/spec/helpers/posts_helper_spec.rb +64 -0
- data/spec/lib/mist/code_example_parser_spec.rb +135 -0
- data/spec/lib/mist/configuration_spec.rb +88 -0
- data/spec/lib/mist/permalink_spec.rb +17 -0
- data/spec/lib/mist/repository_spec.rb +20 -0
- data/spec/models/mist/git_model_spec.rb +260 -0
- data/spec/models/mist/post_spec.rb +575 -0
- data/spec/requests/posts_caching_spec.rb +152 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/support/cache_helpers.rb +71 -0
- data/spec/support/config.rb +42 -0
- data/spec/support/fakeweb.rb +3 -0
- data/spec/views/mist/posts/edit.html.erb_spec.rb +11 -0
- data/spec/views/mist/posts/index.html.erb_spec.rb +27 -0
- data/spec/views/mist/posts/new.html.erb_spec.rb +15 -0
- data/spec/views/mist/posts/show.html.erb_spec.rb +11 -0
- metadata +371 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
class Mist::GitModel::Attributes < HashWithIndifferentAccess
|
2
|
+
def initialize(model)
|
3
|
+
@model = model
|
4
|
+
super()
|
5
|
+
end
|
6
|
+
|
7
|
+
def []=(key, value)
|
8
|
+
@model.send(:"#{key}_will_change!") unless !@model || value == self[key]
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
# Yamlers using Psych will call this method, we just delegate it into
|
13
|
+
# `HashWithIndifferentAccess`. If we don't, the yaml tag will be
|
14
|
+
# "!ruby/object:Mist::GitModel::Attributes" so that when the record
|
15
|
+
# is deserialized, this class will be instantiated, resulting in an
|
16
|
+
# error. (This class should only be instantiated directly by
|
17
|
+
# `Mist::GitModel`.)
|
18
|
+
def to_yaml(*args)
|
19
|
+
HashWithIndifferentAccess.new(self).to_yaml(*args)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
module Mist::GitModel::ClassMethods
|
2
|
+
def self.extended(base) #:nodoc:
|
3
|
+
base.class_attribute :default_attributes
|
4
|
+
base.default_attributes ||= HashWithIndifferentAccess.new
|
5
|
+
end
|
6
|
+
|
7
|
+
# this is necessary because without it default_attributes will be
|
8
|
+
# inherited and shared across all subclasses of base, which we
|
9
|
+
# don't exactly want.
|
10
|
+
def inherited(subclass) #:nodoc:
|
11
|
+
if subclass.default_attributes
|
12
|
+
subclass.default_attributes = subclass.default_attributes.dup
|
13
|
+
else
|
14
|
+
subclass.default_attributes = HashWithIndifferentAccess.new
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def timestamps
|
19
|
+
attribute :created_at, :default => proc { Time.now }
|
20
|
+
attribute :updated_at, :default => proc { Time.now }
|
21
|
+
before_save { |record| record.updated_at = Time.now }
|
22
|
+
end
|
23
|
+
|
24
|
+
def attribute(name, options = {})
|
25
|
+
name = name.to_sym
|
26
|
+
default_attributes[name] = options[:default]
|
27
|
+
define_attribute_methods [name.to_s]
|
28
|
+
add_attribute_default(name, options)
|
29
|
+
add_attribute_getter(name)
|
30
|
+
add_attribute_setter(name)
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_attribute_getter(name)
|
34
|
+
define_method(name) do # def id
|
35
|
+
attributes[name] # attributes[:id]
|
36
|
+
end # end
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_attribute_setter(name)
|
40
|
+
define_method(:"#{name}=") do |value| # def id=(value)
|
41
|
+
unless value == attributes[name] # unless value == attributes[:id]
|
42
|
+
attributes[name] = value # attributes[:id] = value
|
43
|
+
end # end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_attribute_default(name, options)
|
48
|
+
define_method(:"default_#{name}") do # def default_id
|
49
|
+
if options[:default].kind_of?(Proc) # if options[:default].kind_of?(Proc)
|
50
|
+
options[:default].call # options[:default].call
|
51
|
+
else # else
|
52
|
+
options[:default] # options[:default]
|
53
|
+
end # end
|
54
|
+
end # end
|
55
|
+
end
|
56
|
+
|
57
|
+
def table_name
|
58
|
+
if name =~ /GitModel/
|
59
|
+
raise
|
60
|
+
end
|
61
|
+
name.underscore.pluralize
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns meta data for this model.
|
65
|
+
def [](type)
|
66
|
+
@meta ||= {}
|
67
|
+
@meta[type] ||= if File.file?(meta_file_path(type))
|
68
|
+
YAML.load(File.read(meta_file_path(type))) || {}
|
69
|
+
else
|
70
|
+
{}
|
71
|
+
end.with_indifferent_access
|
72
|
+
end
|
73
|
+
|
74
|
+
# Assigns, saves and commits meta data for this model.
|
75
|
+
def save_meta_data(type)
|
76
|
+
FileUtils.mkdir_p File.dirname(meta_file_path(type))
|
77
|
+
File.open(meta_file_path(type), 'w') { |f| f.print self[type].to_yaml }
|
78
|
+
if Mist.commit_meta_data
|
79
|
+
Mist.repository.add meta_file_path(type)
|
80
|
+
Mist.repository.commit '%s meta changes to %s' % [type, table_name]
|
81
|
+
end
|
82
|
+
|
83
|
+
# we must force meta to be reloaded because otherwise it could get out of sync with filesystem
|
84
|
+
@meta = nil
|
85
|
+
end
|
86
|
+
|
87
|
+
def meta_file_path(type)
|
88
|
+
Mist.repository_location.join('.meta', table_name, type.to_s)
|
89
|
+
end
|
90
|
+
|
91
|
+
def all
|
92
|
+
# it's dangerous to rely on Dir[] because we have no guarantee of the
|
93
|
+
# returned order. Git will be more reliable.
|
94
|
+
files = Mist::GitFileSystemHistory.new(Mist.repository).find(nil, /^#{Regexp::escape table_name}\/?/)
|
95
|
+
files.collect! { |path| load Mist.repository_location.join(path) }
|
96
|
+
end
|
97
|
+
|
98
|
+
def load(path, attributes = {})
|
99
|
+
# id is always the filename, ensure id isn't changed by yaml
|
100
|
+
attributes = attributes.with_indifferent_access.reverse_merge(YAML.load(File.read(path)))
|
101
|
+
attributes['id'] = File.basename(path)
|
102
|
+
new(attributes).tap do |instance|
|
103
|
+
instance.changed_attributes.clear
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def record_path(id)
|
108
|
+
Mist.repository_location.join(table_name, id.to_s)
|
109
|
+
end
|
110
|
+
|
111
|
+
def find(id, new_attributes = {})
|
112
|
+
if path = exist?(id)
|
113
|
+
load path, new_attributes
|
114
|
+
else
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# If the id exists, its file path is returned. Otherwise, nil.
|
120
|
+
def exist?(id)
|
121
|
+
path = record_path(id)
|
122
|
+
File.exist?(path) ? path : nil
|
123
|
+
end
|
124
|
+
|
125
|
+
def last(count = nil)
|
126
|
+
files = Mist::GitFileSystemHistory.new(Mist.repository).find(count || 1, /^#{Regexp::escape table_name}\/?/)
|
127
|
+
files.collect! { |path| load Mist.repository_location.join(path) }
|
128
|
+
count.nil? ? files.first : files
|
129
|
+
end
|
130
|
+
|
131
|
+
def create!(attributes = {})
|
132
|
+
new(attributes).tap do |record|
|
133
|
+
record.save!
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def count
|
138
|
+
Dir[Mist.repository_location.join(table_name, '*')].length
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Mist::Repository
|
2
|
+
def repository
|
3
|
+
@repository ||= begin
|
4
|
+
if File.directory? Mist.repository_location.join('.git')
|
5
|
+
Git.open(Mist.repository_location.to_s, :log => Rails.logger)
|
6
|
+
else
|
7
|
+
Git.init(Mist.repository_location.to_s, :log => Rails.logger)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def reload_repository!
|
13
|
+
@repository = nil
|
14
|
+
end
|
15
|
+
end
|
data/lib/mist/version.rb
ADDED
data/mist.gemspec
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "mist/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "mist"
|
7
|
+
s.version = Mist::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Colin MacKenzie IV"]
|
10
|
+
s.email = ["sinisterchipmunk@gmail.com"]
|
11
|
+
s.homepage = "http://github.com/sinisterchipmunk/mist"
|
12
|
+
s.summary = %q{a git-powered, gist-backed blogging engine for Rails 3}
|
13
|
+
s.description = %q{a git-powered, gist-backed blogging engine for Rails 3}
|
14
|
+
|
15
|
+
s.add_dependency 'git', '~> 1.2'
|
16
|
+
s.add_dependency 'github-markup', '~> 0.7'
|
17
|
+
s.add_dependency 'redcarpet', '~> 2.0'
|
18
|
+
s.add_dependency 'activegist', '~> 0.6'
|
19
|
+
|
20
|
+
s.add_development_dependency 'cucumber-rails', '~> 1.2.1'
|
21
|
+
s.add_development_dependency 'database_cleaner', '~> 0.7.0'
|
22
|
+
s.add_development_dependency 'rspec-rails', '~> 2.8.1'
|
23
|
+
s.add_development_dependency 'fakeweb', '~> 1.3.0'
|
24
|
+
# v1.5.0 has gemspec errors under ree, so force v1.4.0 until that's fixed
|
25
|
+
s.add_development_dependency 'factory_girl_rails', '= 1.4.0'
|
26
|
+
|
27
|
+
s.rubyforge_project = "mist"
|
28
|
+
|
29
|
+
s.files = `git ls-files`.split("\n")
|
30
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
31
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
32
|
+
s.require_paths = ["lib"]
|
33
|
+
end
|
@@ -0,0 +1,263 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mist::PostsController do
|
4
|
+
before { Mist.authorize :all do true end }
|
5
|
+
|
6
|
+
# This should return the minimal set of attributes required to create a valid
|
7
|
+
# Post. As you add validations to Post, be sure to
|
8
|
+
# update the return value of this method accordingly.
|
9
|
+
def valid_attributes
|
10
|
+
attributes_for :post
|
11
|
+
end
|
12
|
+
|
13
|
+
# This should return the minimal set of values that should be in the session
|
14
|
+
# in order to pass any filters (e.g. authentication) defined in
|
15
|
+
# PostsController. Be sure to keep this updated too.
|
16
|
+
def valid_session
|
17
|
+
{}
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "GET feed .rss" do
|
21
|
+
it "redirects to feed .atom" do
|
22
|
+
get :feed, {:format => :rss}, valid_session
|
23
|
+
response.should redirect_to(feed_posts_path :format => :atom)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "GET index" do
|
28
|
+
it "assigns all posts as @posts" do
|
29
|
+
post = create :post, :published_at => Time.now
|
30
|
+
get :index, {:use_route => :mist}, valid_session
|
31
|
+
assigns(:posts).should eq([post])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "GET show" do
|
36
|
+
describe "draft while unauthorized" do
|
37
|
+
before { Mist.authorize(:view_drafts) { false } }
|
38
|
+
|
39
|
+
it "does not assign the requested post as @post" do
|
40
|
+
post = Mist::Post.create! valid_attributes
|
41
|
+
get :show, {:id => post.to_param}, valid_session
|
42
|
+
assigns(:post).should eq(post)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "does not increment the post popularity" do
|
46
|
+
post = Mist::Post.create! valid_attributes
|
47
|
+
popularity = post.popularity
|
48
|
+
get :show, {:id => post.to_param}, valid_session
|
49
|
+
popularity.should == Mist::Post.popularity_for(post.id)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "redirects out" do
|
53
|
+
post = Mist::Post.create! valid_attributes
|
54
|
+
get :show, {:id => post.to_param}, valid_session
|
55
|
+
response.should redirect_to(posts_path)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
it "assigns the requested post as @post" do
|
60
|
+
post = Mist::Post.create! valid_attributes.merge(:published => true)
|
61
|
+
get :show, {:id => post.to_param}, valid_session
|
62
|
+
assigns(:post).should eq(post)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "increments the post popularity" do
|
66
|
+
post = Mist::Post.create! valid_attributes.merge(:published_at => Time.now)
|
67
|
+
popularity = post.popularity
|
68
|
+
get :show, {:id => post.to_param}, valid_session
|
69
|
+
popularity.should be < Mist::Post.popularity_for(post.id)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "GET new" do
|
74
|
+
describe "while unauthorized" do
|
75
|
+
before { Mist.authorize(:create_post) { false } }
|
76
|
+
|
77
|
+
it "should redirect" do
|
78
|
+
post = Mist::Post.create! valid_attributes
|
79
|
+
get :new, {}, valid_session
|
80
|
+
response.status.should redirect_to(posts_path)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
it "assigns a new post as @post" do
|
85
|
+
get :new, {}, valid_session
|
86
|
+
assigns(:post).should be_a_new(Mist::Post)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "GET edit" do
|
91
|
+
describe "while unauthorized" do
|
92
|
+
before { Mist.authorize(:update_post) { false } }
|
93
|
+
|
94
|
+
it "should redirect" do
|
95
|
+
post = Mist::Post.create! valid_attributes
|
96
|
+
get :edit, {:id => post.to_param}, valid_session
|
97
|
+
response.status.should redirect_to(posts_path)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
it "assigns the requested post as @post" do
|
102
|
+
post = Mist::Post.create! valid_attributes
|
103
|
+
get :edit, {:id => post.to_param}, valid_session
|
104
|
+
assigns(:post).should eq(post)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "POST create" do
|
109
|
+
describe "while unauthorized" do
|
110
|
+
before { Mist.authorize(:create_post) { false } }
|
111
|
+
|
112
|
+
it "should not create a new post" do
|
113
|
+
expect {
|
114
|
+
post :create, {:post => valid_attributes}, valid_session
|
115
|
+
}.to_not change(Mist::Post, :count).by(1)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should not assign post" do
|
119
|
+
post :create, {:post => valid_attributes}, valid_session
|
120
|
+
assigns(:post).should_not be_a(Mist::Post)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should redirect out" do
|
124
|
+
post :create, {:post => valid_attributes}, valid_session
|
125
|
+
response.should redirect_to(posts_path)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "with valid params" do
|
130
|
+
it "creates a new Post" do
|
131
|
+
expect {
|
132
|
+
post :create, {:post => valid_attributes}, valid_session
|
133
|
+
}.to change(Mist::Post, :count).by(1)
|
134
|
+
end
|
135
|
+
|
136
|
+
it "assigns a newly created post as @post" do
|
137
|
+
post :create, {:post => valid_attributes}, valid_session
|
138
|
+
assigns(:post).should be_a(Mist::Post)
|
139
|
+
assigns(:post).should be_persisted
|
140
|
+
end
|
141
|
+
|
142
|
+
it "redirects to the created post" do
|
143
|
+
post :create, {:post => valid_attributes}, valid_session
|
144
|
+
response.should redirect_to(Mist::Post.last)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "with invalid params" do
|
149
|
+
it "assigns a newly created but unsaved post as @post" do
|
150
|
+
# Trigger the behavior that occurs when invalid params are submitted
|
151
|
+
Mist::Post.any_instance.stub(:save).and_return(false)
|
152
|
+
post :create, {:post => {}}, valid_session
|
153
|
+
assigns(:post).should be_a_new(Mist::Post)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "re-renders the 'new' template" do
|
157
|
+
# Trigger the behavior that occurs when invalid params are submitted
|
158
|
+
Mist::Post.any_instance.stub(:save).and_return(false)
|
159
|
+
post :create, {:post => {}}, valid_session
|
160
|
+
response.should render_template("new")
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "PUT update" do
|
166
|
+
describe "with valid params" do
|
167
|
+
describe "while unauthorized" do
|
168
|
+
before { Mist.authorize(:update_post) { false } }
|
169
|
+
|
170
|
+
it "should not update the post" do
|
171
|
+
post = Mist::Post.create! valid_attributes
|
172
|
+
Mist::Post.any_instance.should_not_receive(:update_attributes).with({'these' => 'params'})
|
173
|
+
put :update, {:id => post.to_param, :post => {'these' => 'params'}}, valid_session
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should not assign post" do
|
177
|
+
post = Mist::Post.create! valid_attributes
|
178
|
+
put :update, {:id => post.to_param, :post => valid_attributes}, valid_session
|
179
|
+
assigns(:post).should_not be_a(Mist::Post)
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should redirect out" do
|
183
|
+
post = Mist::Post.create! valid_attributes
|
184
|
+
put :update, {:id => post.to_param, :post => valid_attributes}, valid_session
|
185
|
+
response.should redirect_to(posts_path)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
it "updates the requested post" do
|
190
|
+
post = Mist::Post.create! valid_attributes
|
191
|
+
# Assuming there are no other posts in the database, this
|
192
|
+
# specifies that the Mist::Post created on the previous line
|
193
|
+
# receives the :update_attributes message with whatever params are
|
194
|
+
# submitted in the request.
|
195
|
+
Mist::Post.any_instance.should_receive(:update_attributes).with({'these' => 'params'})
|
196
|
+
put :update, {:id => post.to_param, :post => {'these' => 'params'}}, valid_session
|
197
|
+
end
|
198
|
+
|
199
|
+
it "assigns the requested post as @post" do
|
200
|
+
post = Mist::Post.create! valid_attributes
|
201
|
+
put :update, {:id => post.to_param, :post => valid_attributes}, valid_session
|
202
|
+
assigns(:post).should eq(post)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "redirects to the post" do
|
206
|
+
post = Mist::Post.create! valid_attributes
|
207
|
+
put :update, {:id => post.to_param, :post => valid_attributes}, valid_session
|
208
|
+
response.should redirect_to(post)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe "with invalid params" do
|
213
|
+
it "assigns the post as @post" do
|
214
|
+
post = Mist::Post.create! valid_attributes
|
215
|
+
# Trigger the behavior that occurs when invalid params are submitted
|
216
|
+
Mist::Post.any_instance.stub(:save).and_return(false)
|
217
|
+
put :update, {:id => post.to_param, :post => {}}, valid_session
|
218
|
+
assigns(:post).should eq(post)
|
219
|
+
end
|
220
|
+
|
221
|
+
it "re-renders the 'edit' template" do
|
222
|
+
post = Mist::Post.create! valid_attributes
|
223
|
+
# Trigger the behavior that occurs when invalid params are submitted
|
224
|
+
Mist::Post.any_instance.stub(:save).and_return(false)
|
225
|
+
put :update, {:id => post.to_param, :post => {}}, valid_session
|
226
|
+
response.should render_template("edit")
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
describe "DELETE destroy" do
|
232
|
+
describe "while unauthorized" do
|
233
|
+
before { Mist.authorize(:destroy_post) { false } }
|
234
|
+
|
235
|
+
it "does not destroy the requested post" do
|
236
|
+
post = Mist::Post.create! valid_attributes
|
237
|
+
expect {
|
238
|
+
delete :destroy, {:id => post.to_param}, valid_session
|
239
|
+
}.to_not change(Mist::Post, :count).by(-1)
|
240
|
+
end
|
241
|
+
|
242
|
+
it "redirects to the posts list" do
|
243
|
+
post = Mist::Post.create! valid_attributes
|
244
|
+
delete :destroy, {:id => post.to_param}, valid_session
|
245
|
+
response.should redirect_to(posts_path)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
it "destroys the requested post" do
|
250
|
+
post = Mist::Post.create! valid_attributes
|
251
|
+
expect {
|
252
|
+
delete :destroy, {:id => post.to_param}, valid_session
|
253
|
+
}.to change(Mist::Post, :count).by(-1)
|
254
|
+
end
|
255
|
+
|
256
|
+
it "redirects to the posts list" do
|
257
|
+
post = Mist::Post.create! valid_attributes
|
258
|
+
delete :destroy, {:id => post.to_param}, valid_session
|
259
|
+
response.should redirect_to(posts_path)
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
end
|