exposition 0.0.3.pre.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +25 -0
  4. data/app/assets/images/exposition/twitter.svg +10 -0
  5. data/app/assets/javascripts/exposition/admin/application.js +3 -0
  6. data/app/assets/stylesheets/exposition/_breakpoints.scss +5 -0
  7. data/app/assets/stylesheets/exposition/_code.scss +83 -0
  8. data/app/assets/stylesheets/exposition/_footer.scss +9 -0
  9. data/app/assets/stylesheets/exposition/_header.scss +62 -0
  10. data/app/assets/stylesheets/exposition/_layout.scss +28 -0
  11. data/app/assets/stylesheets/exposition/_mixins.scss +4 -0
  12. data/app/assets/stylesheets/exposition/_normalize.scss +427 -0
  13. data/app/assets/stylesheets/exposition/_pagination.scss +18 -0
  14. data/app/assets/stylesheets/exposition/_posts.scss +96 -0
  15. data/app/assets/stylesheets/exposition/_tags.scss +12 -0
  16. data/app/assets/stylesheets/exposition/_variables.scss +16 -0
  17. data/app/assets/stylesheets/exposition/admin/_layout.scss +58 -0
  18. data/app/assets/stylesheets/exposition/admin/_mixins.scss +3 -0
  19. data/app/assets/stylesheets/exposition/admin/_notifications.scss +46 -0
  20. data/app/assets/stylesheets/exposition/admin/_pagination.scss +12 -0
  21. data/app/assets/stylesheets/exposition/admin/_posts.scss +7 -0
  22. data/app/assets/stylesheets/exposition/admin/application.scss +9 -0
  23. data/app/assets/stylesheets/exposition/admin/base/_base.scss +15 -0
  24. data/app/assets/stylesheets/exposition/admin/base/_buttons.scss +31 -0
  25. data/app/assets/stylesheets/exposition/admin/base/_forms.scss +78 -0
  26. data/app/assets/stylesheets/exposition/admin/base/_grid-settings.scss +14 -0
  27. data/app/assets/stylesheets/exposition/admin/base/_lists.scss +31 -0
  28. data/app/assets/stylesheets/exposition/admin/base/_tables.scss +25 -0
  29. data/app/assets/stylesheets/exposition/admin/base/_typography.scss +55 -0
  30. data/app/assets/stylesheets/exposition/admin/base/_variables.scss +35 -0
  31. data/app/assets/stylesheets/exposition/admin/normalize.scss +427 -0
  32. data/app/assets/stylesheets/exposition/application.scss +17 -0
  33. data/app/controllers/exposition/admin/admin_controller.rb +5 -0
  34. data/app/controllers/exposition/admin/posts_controller.rb +5 -0
  35. data/app/controllers/exposition/admin/sessions_controller.rb +31 -0
  36. data/app/controllers/exposition/admin/tags_controller.rb +5 -0
  37. data/app/controllers/exposition/application_controller.rb +8 -0
  38. data/app/controllers/exposition/posts_controller.rb +5 -0
  39. data/app/controllers/exposition/tags_controller.rb +5 -0
  40. data/app/helpers/exposition/admin/flashes_helper.rb +7 -0
  41. data/app/helpers/exposition/admin/sessions_helper.rb +20 -0
  42. data/app/helpers/exposition/markdown_helper.rb +21 -0
  43. data/app/models/categorical/tag.rb +6 -0
  44. data/app/models/exposition/encryptor.rb +10 -0
  45. data/app/models/exposition/post.rb +5 -0
  46. data/app/models/exposition/user.rb +5 -0
  47. data/app/views/exposition/admin/images/index.html.haml +12 -0
  48. data/app/views/exposition/admin/images/new.html.haml +0 -0
  49. data/app/views/exposition/admin/posts/_error_handler.html.haml +8 -0
  50. data/app/views/exposition/admin/posts/_form_fields.html.haml +23 -0
  51. data/app/views/exposition/admin/posts/edit.html.haml +5 -0
  52. data/app/views/exposition/admin/posts/index.html.haml +23 -0
  53. data/app/views/exposition/admin/posts/new.html.haml +7 -0
  54. data/app/views/exposition/admin/posts/update.html.haml +2 -0
  55. data/app/views/exposition/admin/sessions/new.html.haml +10 -0
  56. data/app/views/exposition/admin/tags/_error_handler.html.haml +8 -0
  57. data/app/views/exposition/admin/tags/edit.html.haml +10 -0
  58. data/app/views/exposition/admin/tags/index.html.haml +18 -0
  59. data/app/views/exposition/admin/tags/new.html.haml +10 -0
  60. data/app/views/exposition/posts/_post.html.haml +8 -0
  61. data/app/views/exposition/posts/_tags.html.haml +6 -0
  62. data/app/views/exposition/posts/index.html.haml +8 -0
  63. data/app/views/exposition/posts/show.html.haml +5 -0
  64. data/app/views/exposition/tags/show.html.haml +6 -0
  65. data/app/views/layouts/exposition/admin.html.haml +22 -0
  66. data/app/views/layouts/exposition/application.html.haml +20 -0
  67. data/config/locales/en.yml +37 -0
  68. data/config/routes.rb +14 -0
  69. data/db/migrate/20160106220615_create_exposition_posters.rb +12 -0
  70. data/db/migrate/20160112194424_add_author_id_to_posts.rb +5 -0
  71. data/db/migrate/20160112200248_create_exposition_users.rb +14 -0
  72. data/db/migrate/20160112202302_add_slug_to_expositon_posts.rb +7 -0
  73. data/db/migrate/20160112204019_add_categorial_tags.rb +17 -0
  74. data/db/migrate/20160225203524_add_summary_to_posts.rb +5 -0
  75. data/db/migrate/20160226035733_convert_published_at_to_datetime.rb +9 -0
  76. data/lib/exposition.rb +19 -0
  77. data/lib/exposition/concerns/controllers/admin/admin_controller.rb +39 -0
  78. data/lib/exposition/concerns/controllers/admin/posts_controller.rb +70 -0
  79. data/lib/exposition/concerns/controllers/admin/tags_controller.rb +63 -0
  80. data/lib/exposition/concerns/controllers/posts_controller.rb +19 -0
  81. data/lib/exposition/concerns/controllers/tags_controller.rb +31 -0
  82. data/lib/exposition/concerns/models/post.rb +52 -0
  83. data/lib/exposition/concerns/models/user.rb +43 -0
  84. data/lib/exposition/engine.rb +14 -0
  85. data/lib/exposition/setup.rb +15 -0
  86. data/lib/exposition/version.rb +3 -0
  87. data/lib/tasks/exposition_tasks.rake +4 -0
  88. data/lib/tasks/setup.rb +17 -0
  89. data/spec/controllers/exposition/admin/admin_controller_spec.rb +88 -0
  90. data/spec/controllers/exposition/admin/posts_controller_spec.rb +153 -0
  91. data/spec/controllers/exposition/admin/sessions_controller_spec.rb +46 -0
  92. data/spec/controllers/exposition/admin/tags_controller_spec.rb +106 -0
  93. data/spec/controllers/exposition/posts_controller_spec.rb +43 -0
  94. data/spec/controllers/exposition/tags_controller_spec.rb +40 -0
  95. data/spec/dummy/Gemfile +5 -0
  96. data/spec/dummy/Gemfile.lock +173 -0
  97. data/spec/dummy/README.rdoc +28 -0
  98. data/spec/dummy/Rakefile +6 -0
  99. data/spec/dummy/Thorfile +1 -0
  100. data/spec/dummy/app/assets/javascripts/application.js +1 -0
  101. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  102. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  103. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  104. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  105. data/spec/dummy/bin/bundle +3 -0
  106. data/spec/dummy/bin/rails +9 -0
  107. data/spec/dummy/bin/rake +9 -0
  108. data/spec/dummy/bin/setup +29 -0
  109. data/spec/dummy/bin/spring +15 -0
  110. data/spec/dummy/bin/thor +16 -0
  111. data/spec/dummy/config.ru +4 -0
  112. data/spec/dummy/config/application.rb +26 -0
  113. data/spec/dummy/config/boot.rb +3 -0
  114. data/spec/dummy/config/database.yml +12 -0
  115. data/spec/dummy/config/environment.rb +5 -0
  116. data/spec/dummy/config/environments/development.rb +41 -0
  117. data/spec/dummy/config/environments/production.rb +79 -0
  118. data/spec/dummy/config/environments/test.rb +42 -0
  119. data/spec/dummy/config/initializers/assets.rb +11 -0
  120. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  121. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  122. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  123. data/spec/dummy/config/initializers/inflections.rb +16 -0
  124. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  125. data/spec/dummy/config/initializers/session_store.rb +3 -0
  126. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  127. data/spec/dummy/config/locales/en.yml +23 -0
  128. data/spec/dummy/config/routes.rb +3 -0
  129. data/spec/dummy/config/secrets.yml +22 -0
  130. data/spec/dummy/db/schema.rb +62 -0
  131. data/spec/dummy/db/seeds.rb +22 -0
  132. data/spec/dummy/public/404.html +67 -0
  133. data/spec/dummy/public/422.html +67 -0
  134. data/spec/dummy/public/500.html +66 -0
  135. data/spec/dummy/public/favicon.ico +0 -0
  136. data/spec/dummy/public/robots.txt +5 -0
  137. data/spec/factories/categorical/tags.rb +5 -0
  138. data/spec/factories/posts.rb +8 -0
  139. data/spec/factories/taggings.rb +7 -0
  140. data/spec/factories/users.rb +7 -0
  141. data/spec/features/admin/post_management_spec.rb +95 -0
  142. data/spec/features/admin/session_management_spec.rb +40 -0
  143. data/spec/features/admin/tags_management_spec.rb +59 -0
  144. data/spec/features/posts_index_spec.rb +28 -0
  145. data/spec/features/viewing_a_post_spec.rb +21 -0
  146. data/spec/features/viewing_posts_by_tag_spec.rb +17 -0
  147. data/spec/helpers/admin/flashes_helper_spec.rb +29 -0
  148. data/spec/helpers/admin/sessions_helper_spec.rb +56 -0
  149. data/spec/helpers/markdown_helper_spec.rb +10 -0
  150. data/spec/models/categorical/tag_spec.rb +35 -0
  151. data/spec/models/exposition/post_spec.rb +123 -0
  152. data/spec/models/exposition/user_spec.rb +15 -0
  153. data/spec/rails_helper.rb +47 -0
  154. data/spec/spec_helper.rb +11 -0
  155. data/spec/support/controllers.rb +6 -0
  156. data/spec/support/controllers/pagination.rb +17 -0
  157. data/spec/support/controllers/session_management.rb +20 -0
  158. data/spec/support/features.rb +6 -0
  159. data/spec/support/features/pagination.rb +22 -0
  160. data/spec/support/features/session_management.rb +17 -0
  161. data/spec/support/models.rb +5 -0
  162. data/spec/support/models/sluggable.rb +11 -0
  163. data/spec/tasks/setup_spec.rb +32 -0
  164. data/spec/views/admin/posts/index.html.haml_spec.rb +16 -0
  165. metadata +619 -0
@@ -0,0 +1,28 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.feature "Posts index page", :type => :feature do
4
+ scenario "a visitor can view published posts" do
5
+ published_post = create(:post, published: true, title: 'Post1')
6
+ unpublished_post = create(:post, published: false, title: 'Post2')
7
+
8
+ visit exposition_path
9
+
10
+ expect(page).to have_text('Post1')
11
+ expect(page).to_not have_text('Post2')
12
+ end
13
+
14
+ scenario "a visitor received a notification when there are no posts" do
15
+ visit exposition_path
16
+
17
+ expect(page).to have_text(I18n.t("posts.index.no_posts_warning"))
18
+ end
19
+
20
+ it do
21
+ paginates(factory: :post,
22
+ increment: 10,
23
+ selector: 'article',
24
+ attributes:{published: true}) do
25
+ visit exposition_path
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.feature "Viewing a post", :type => :feature do
4
+ scenario "a visitor can view published posts" do
5
+ post = create(:post, published: true)
6
+
7
+ visit exposition_path
8
+ click_link(post.title)
9
+
10
+ expect(current_path).to eq(exposition.post_path(post))
11
+ expect(page).to have_text(post.title)
12
+ expect(page).to have_text(post.body)
13
+ end
14
+
15
+ scenario "a visitor cannot view unpublished posts" do
16
+ post = create(:post, published: false)
17
+
18
+ expect { visit exposition.post_path(post) }.
19
+ to raise_error(ActiveRecord::RecordNotFound)
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.feature "Viewing posts by tag", :type => :feature do
4
+ scenario "a visitor can view published posts by clicking a tag" do
5
+ tag1 = create(:tag, label: 'tag1')
6
+ tag2 = create(:tag, label: 'tag2')
7
+ post1 = create(:post, published: true, title: 'post1', tags: [tag1])
8
+ post2 = create(:post, published: true, title: 'post2', tags: [tag2])
9
+
10
+ visit exposition_path
11
+ click_on 'tag1'
12
+
13
+ expect(current_path).to eq(exposition.tag_path(tag1))
14
+ expect(page).to have_text('post1')
15
+ expect(page).to_not have_text('post2')
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Exposition::Admin::FlashesHelper, type: :helper do
4
+ it "converts the the flash into a hash" do
5
+ flash = double("flash")
6
+ allow(flash).to receive(:to_hash).and_return({})
7
+ allow(helper).to receive(:flash).and_return(flash)
8
+
9
+ helper.user_facing_flashes
10
+
11
+ expect(flash).to have_received(:to_hash)
12
+ end
13
+
14
+ it "removes unneeded keys" do
15
+ flash = { "a" => "1",
16
+ "alert" => "2",
17
+ "error" => "3",
18
+ "notice" => "4",
19
+ "success" => "5"
20
+ }
21
+
22
+ allow(helper).to receive(:flash).and_return(flash)
23
+
24
+ processed_flash = helper.user_facing_flashes
25
+
26
+ expect(processed_flash).to include("alert")
27
+ expect(processed_flash).to_not include("a")
28
+ end
29
+ end
@@ -0,0 +1,56 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Exposition::Admin::SessionsHelper, type: :helper do
4
+ describe "#current_user" do
5
+ context "when logged in via a session" do
6
+ it "returns the logged in user" do
7
+ user = create(:user,
8
+ password: 'password',
9
+ email: 'j@j.com',
10
+ name: 'Josh')
11
+ session_params = {user_id: user.id}
12
+ allow(helper).to receive(:session).and_return(session_params)
13
+
14
+ expect(helper.current_user).to eq(user)
15
+ end
16
+ end
17
+
18
+
19
+ context "when logged in via a cookie" do
20
+ it "returns the logged in user and sets the user_id in the session" do
21
+ user = create(:user,
22
+ password: 'password',
23
+ email: 'j@j.com',
24
+ name: 'Josh')
25
+ user.set_encrypted_remember_token!
26
+ session_params = {}
27
+ signed_cookie_params = {user_id: user.id}
28
+ cookie_params = {remember_token: user.remember_token}
29
+ fake_cookie = FakeCookies.new(
30
+ signed: signed_cookie_params,
31
+ unsigned: cookie_params
32
+ )
33
+ allow(controller).to receive(:cookies).and_return(fake_cookie)
34
+ allow(controller).to receive(:session).and_return(session_params)
35
+
36
+ expect(helper.current_user).to eq(user)
37
+ expect(session_params[:user_id]).to eq(user.id)
38
+ end
39
+ end
40
+
41
+ class FakeCookies
42
+ def initialize(unsigned:{}, signed:{})
43
+ @signed = signed
44
+ @unsigned = unsigned
45
+ end
46
+
47
+ def [](key)
48
+ @unsigned[key]
49
+ end
50
+
51
+ def signed
52
+ @signed
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,10 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Exposition::MarkdownHelper, type: :helper do
4
+ describe "#markdown_to_html" do
5
+ it "converts markdown into html" do
6
+ expect(helper.markdown_to_html("this *is* really great")).
7
+ to eq("<p>this <em>is</em> really great</p>\n")
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Categorical::Tag, type: :model do
4
+ # it_behaves_like "a sluggable"
5
+
6
+ describe "#slug" do
7
+ it "is created automatically from the label if not provided" do
8
+ tag = create(:tag, label: "My Tag")
9
+
10
+ expect(tag.slug).to eq('my-tag')
11
+ end
12
+
13
+ it "is created by user input if provided" do
14
+ tag = create(:tag, label: "My Tag", slug: "my slug")
15
+
16
+ expect(tag.slug).to eq('my-slug')
17
+ end
18
+ end
19
+
20
+ describe "#to_param" do
21
+ it "returns the slug" do
22
+ tag = build(:tag, slug: 'my-slug')
23
+
24
+ expect(tag.to_param).to eq('my-slug')
25
+ end
26
+ end
27
+
28
+ describe "#to_s" do
29
+ it "returns the label" do
30
+ tag = build(:tag, label: 'coffee')
31
+
32
+ expect(tag.to_s).to eq('coffee')
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,123 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Exposition::Post, type: :model do
4
+ it { should have_many(:tags) }
5
+ it { should belong_to(:author).class_name('User') }
6
+
7
+ it { should validate_presence_of(:title) }
8
+ it { should validate_presence_of(:author) }
9
+ it { should validate_length_of(:title).is_at_most(244) }
10
+ it { should validate_presence_of(:body) }
11
+
12
+ describe "#summary" do
13
+ it "offers a the body if no summary is provided" do
14
+ post = build(:post, body: 'This is my body', summary: nil)
15
+
16
+ expect(post.summary).to eq('This is my body')
17
+ end
18
+
19
+ it "give the summary if one is provided" do
20
+ post = build(:post, body: 'This is my body',
21
+ summary: 'This is my summary.')
22
+
23
+ expect(post.summary).to eq('This is my summary.')
24
+ end
25
+ end
26
+
27
+ describe "#slug" do
28
+ it "is created automatically from the title if not provided" do
29
+ post = create(:post, title: "My Title")
30
+
31
+ expect(post.slug).to eq('my-title')
32
+ end
33
+
34
+ it "is created user input if provided" do
35
+ post = create(:post, title: "My Title", slug: "my slug")
36
+
37
+ expect(post.slug).to eq('my-slug')
38
+ end
39
+ end
40
+
41
+ describe "#css_classes" do
42
+ it "returns 'not-published' if the article is not published" do
43
+ post = build(:post, published: false)
44
+
45
+ expect(post.css_classes).to eq("not-published")
46
+ end
47
+
48
+ it "returns 'published' if the article is published" do
49
+ post = build(:post, published: true)
50
+
51
+ expect(post.css_classes).to eq("published")
52
+ end
53
+ end
54
+
55
+ describe "#published" do
56
+ it "is false by default" do
57
+ post = build(:post)
58
+
59
+ expect(post.published?).to be_falsey
60
+ end
61
+ end
62
+
63
+ describe ".sorted_by_published_date" do
64
+ it "finds all the published posts ordered by date with the tag" do
65
+ tagged_older_post = create(:post, published: true)
66
+ tagged_newer_post = create(:post, published: true)
67
+
68
+ tagged_older_post.published_at = Time.now - 2.hours
69
+ tagged_newer_post.published_at = Time.now
70
+ tagged_older_post.save!
71
+ tagged_newer_post.save!
72
+
73
+ expect(Exposition::Post.sorted_by_published_date).
74
+ to eq([tagged_newer_post, tagged_older_post])
75
+ end
76
+ end
77
+
78
+ describe ".published" do
79
+ it "returns only published posts" do
80
+ published_post = create(:post, published: true)
81
+ unpublished_post = create(:post, published: false)
82
+
83
+ expect(Exposition::Post.published).to eq([published_post])
84
+ end
85
+ end
86
+
87
+ describe "#published_at" do
88
+ it "is null by default" do
89
+ post = build(:post)
90
+
91
+ expect(post.published_at).to be_nil
92
+ end
93
+
94
+ it "is set to the current date when the post is published" do
95
+ post = create(:post)
96
+
97
+ post.published = true
98
+ post.save!
99
+
100
+ expect(post.published_at).to eq(Date.today)
101
+ end
102
+
103
+ it "only updates when the published attribute changes" do
104
+ post = create(:post, published: true)
105
+
106
+ post.published_at = Date.today - 1.day
107
+ post.save!
108
+
109
+ post.published = true
110
+ post.save!
111
+
112
+ expect(post.published_at).to eq(Date.today - 1.day)
113
+ end
114
+ end
115
+
116
+ describe "#to_param" do
117
+ it "returns the slug" do
118
+ post = build(:post, slug: 'my-slug')
119
+
120
+ expect(post.to_param).to eq('my-slug')
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Exposition::User, type: :model do
4
+ it { should validate_presence_of(:email) }
5
+ it { should validate_presence_of(:name) }
6
+ it { should validate_presence_of(:password) }
7
+ it { should validate_length_of(:name).is_at_most(50) }
8
+ it { should validate_length_of(:email).is_at_most(244) }
9
+ it { should validate_length_of(:password).is_at_least(6) }
10
+ it { should validate_uniqueness_of(:email).case_insensitive }
11
+ it { should allow_value('a@a.com', '12@12.c').for(:email) }
12
+ it { should_not allow_value('a@a', '1', 'a.a').for(:email) }
13
+ it { should have_db_index(:email).unique(true) }
14
+ it { should have_secure_password }
15
+ end
@@ -0,0 +1,47 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV['RAILS_ENV'] ||= 'test'
3
+ require 'spec_helper'
4
+ require File.expand_path('../dummy/config/environment', __FILE__)
5
+ require 'rspec/rails'
6
+ require 'factory_girl_rails'
7
+ require 'database_cleaner'
8
+ require 'shoulda-matchers'
9
+ require 'faker'
10
+ ActiveRecord::Migration.maintain_test_schema!
11
+
12
+ # Adding support files
13
+ # Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
14
+ Dir[Exposition::Engine.root.join("spec/support/**/*.rb")].each { |f| require f }
15
+
16
+ RSpec.configure do |config|
17
+ config.use_transactional_fixtures = true
18
+ config.infer_spec_type_from_file_location!
19
+ config.include FactoryGirl::Syntax::Methods
20
+ config.use_transactional_fixtures = false
21
+
22
+ config.expect_with :rspec do |expectations|
23
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
24
+ end
25
+
26
+ config.mock_with :rspec do |mocks|
27
+ mocks.verify_partial_doubles = true
28
+ end
29
+
30
+ config.before(:suite) do
31
+ DatabaseCleaner.clean_with(:truncation)
32
+ end
33
+
34
+ config.before(:each) do |example|
35
+ DatabaseCleaner.strategy= example.metadata[:js] ? :truncation : :transaction
36
+ DatabaseCleaner.start
37
+ end
38
+
39
+ config.after(:each) do
40
+ DatabaseCleaner.clean
41
+ end
42
+
43
+ # Delete test files from paperclip
44
+ config.after(:suite) do
45
+ FileUtils.rm_rf(Dir["#{Rails.root}/spec/test_files/"])
46
+ end
47
+ end
@@ -0,0 +1,11 @@
1
+ require 'pry-rails'
2
+
3
+ RSpec.configure do |config|
4
+ config.expect_with :rspec do |expectations|
5
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
6
+ end
7
+
8
+ config.mock_with :rspec do |mocks|
9
+ mocks.verify_partial_doubles = true
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ Dir[Rails.root.join('spec/support/controllers/*.rb')].each { |f| require f }
2
+
3
+ RSpec.configure do |config|
4
+ config.include Controllers::SessionManagement, :type => :controller
5
+ config.include Controllers::Pagination, :type => :controller
6
+ end
@@ -0,0 +1,17 @@
1
+ module Controllers
2
+ module Pagination
3
+ def paginates(factory:, increment:)
4
+ factory_string = factory.to_s
5
+ factory = factory_string.underscore.to_sym
6
+ factory_plural = factory_string.pluralize.underscore.to_sym
7
+ number_of_results_for_two_pages = increment + 1
8
+ results =
9
+ FactoryGirl.create_list(factory, number_of_results_for_two_pages)
10
+
11
+ yield
12
+
13
+ expect(assigns(factory_plural).count).to eq(increment)
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,20 @@
1
+ module Controllers
2
+ module SessionManagement
3
+ def create_user_and_login
4
+ user = create(:user)
5
+ fake_login_with(user)
6
+ end
7
+
8
+
9
+ def build_user_and_login
10
+ user = build(:user)
11
+ fake_login_with(user)
12
+ end
13
+
14
+ def fake_login_with(user)
15
+ allow(controller).to receive(:current_user).and_return(user)
16
+ return user
17
+ end
18
+ end
19
+ end
20
+