days 0.2.0 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +21 -4
  3. data/app/javascripts/admin/bootstrap.min.js +7 -0
  4. data/app/javascripts/jquery-2.1.3.min.js +4 -0
  5. data/app/stylesheets/admin/bootstrap-theme.min.css +5 -0
  6. data/app/stylesheets/admin/bootstrap.min.css +5 -0
  7. data/app/stylesheets/admin/login.scss +3 -5
  8. data/app/stylesheets/admin.scss +4 -0
  9. data/app/views/admin/categories.haml +3 -3
  10. data/app/views/admin/entries/form.haml +22 -17
  11. data/app/views/admin/entries/index.haml +46 -28
  12. data/app/views/admin/login.haml +11 -8
  13. data/app/views/admin/setup.haml +16 -9
  14. data/app/views/admin.haml +31 -21
  15. data/days.gemspec +14 -11
  16. data/lib/days/app/admin/entries.rb +11 -5
  17. data/lib/days/app/entries.rb +24 -13
  18. data/lib/days/app.rb +2 -3
  19. data/lib/days/command.rb +1 -1
  20. data/lib/days/config.rb +18 -5
  21. data/lib/days/helpers.rb +13 -11
  22. data/lib/days/models/base.rb +11 -0
  23. data/lib/days/models/category.rb +2 -2
  24. data/lib/days/models/entry.rb +41 -8
  25. data/lib/days/models/user.rb +2 -2
  26. data/lib/days/version.rb +1 -1
  27. data/scripts/tumblr_export.rb +1 -1
  28. data/spec/controllers/admin/categories_spec.rb +22 -22
  29. data/spec/controllers/admin/entries_spec.rb +155 -44
  30. data/spec/controllers/admin/session_spec.rb +16 -25
  31. data/spec/controllers/admin/setup_spec.rb +22 -25
  32. data/spec/controllers/admin/users_spec.rb +39 -40
  33. data/spec/controllers/entries_spec.rb +71 -42
  34. data/spec/helpers_spec.rb +18 -29
  35. data/spec/models/entry_spec.rb +117 -47
  36. data/spec/shared/admin.rb +2 -2
  37. data/spec/spec_helper.rb +25 -25
  38. metadata +111 -86
  39. data/app/javascripts/bootstrap.js +0 -2159
  40. data/app/javascripts/bootstrap.min.js +0 -6
  41. data/app/javascripts/jquery-1.8.3.min.js +0 -2
  42. data/app/stylesheets/bootstrap-responsive.css +0 -1092
  43. data/app/stylesheets/bootstrap-responsive.min.css +0 -9
  44. data/app/stylesheets/bootstrap.css +0 -6039
  45. data/app/stylesheets/bootstrap.min.css +0 -9
@@ -2,24 +2,76 @@ require 'spec_helper'
2
2
 
3
3
  describe Days::App, type: :controller do
4
4
  describe "admin: entries" do
5
- fixtures :users, :categories, :entries
6
- let(:entry) { entries(:entry_one) }
7
- let(:user) { users(:blogger) }
5
+ let!(:entry) { Days::Entry.create!(title: 'foo', body: 'foo') }
6
+ let!(:draft) { Days::Entry.create!(title: 'draft', body: 'foo', draft: true) }
7
+ let!(:scheduled) { Days::Entry.create!(title: 'scheduled', body: 'foo', published_at: Time.now + (86400 * 365)) }
8
+ let(:user) { Days::User.create!(login_name: 'blogger', name: 'blogger', password: 'x', password_confirmation: 'x') }
8
9
 
9
10
  before { login(user) }
10
11
 
11
12
  describe "GET /admin/entries" do
13
+ let(:now) { Time.now }
14
+
15
+ before do
16
+ # fix the time to fix time in SQL statement (might have difference in microsec)
17
+ allow(Time).to receive(:now).and_return(now)
18
+ end
19
+
12
20
  subject { get '/admin/entries', {}, env }
13
21
 
14
22
  it_behaves_like 'an admin page'
15
23
 
16
- it { should be_ok }
24
+ it { is_expected.to be_ok }
17
25
 
18
26
  it "lists up entries" do
19
- render[:data].should == :'admin/entries/index'
27
+ expect(render[:data]).to eq(:'admin/entries/index')
20
28
 
21
29
  entries = render[:ivars][:@entries]
22
- entries.should == Days::Entry.order('id DESC').all
30
+ expect(entries).to eq(Days::Entry.order(id: :desc).page(nil))
31
+ end
32
+
33
+ describe "with page" do
34
+ subject { get '/admin/entries?page=2', {}, env }
35
+
36
+ it "lists up entries for specified page" do
37
+ expect(render[:data]).to eq(:'admin/entries/index')
38
+
39
+ entries = render[:ivars][:@entries]
40
+ expect(entries).to eq(Days::Entry.order(id: :desc).page(2))
41
+ end
42
+ end
43
+
44
+ describe "with draft=1" do
45
+ subject { get '/admin/entries?draft=1', {}, env }
46
+
47
+ it "lists up drafts" do
48
+ expect(render[:data]).to eq(:'admin/entries/index')
49
+
50
+ entries = render[:ivars][:@entries]
51
+ expect(entries).to eq(Days::Entry.order(id: :desc).draft.page(nil))
52
+ end
53
+ end
54
+
55
+ describe "with scheduled=1" do
56
+ subject { get '/admin/entries?scheduled=1', {}, env }
57
+
58
+ it "lists up scheduled entries" do
59
+ expect(render[:data]).to eq(:'admin/entries/index')
60
+
61
+ entries = render[:ivars][:@entries]
62
+ expect(entries).to eq(Days::Entry.order(id: :desc).scheduled.page(1))
63
+ end
64
+ end
65
+
66
+ describe "with published=1" do
67
+ subject { get '/admin/entries?published=1', {}, env }
68
+
69
+ it "lists up published entries" do
70
+ expect(render[:data]).to eq(:'admin/entries/index')
71
+
72
+ entries = render[:ivars][:@entries]
73
+ expect(entries).to eq(Days::Entry.order(id: :desc).published.page(nil))
74
+ end
23
75
  end
24
76
  end
25
77
 
@@ -28,13 +80,13 @@ describe Days::App, type: :controller do
28
80
 
29
81
  it_behaves_like 'an admin page'
30
82
 
31
- it { should be_ok }
83
+ it { is_expected.to be_ok }
32
84
 
33
85
  it "renders form page" do
34
- render[:data].should == :'admin/entries/form'
86
+ expect(render[:data]).to eq(:'admin/entries/form')
35
87
  entry = render[:ivars][:@entry]
36
- entry.should be_a(Days::Entry)
37
- entry.should be_new_record
88
+ expect(entry).to be_a(Days::Entry)
89
+ expect(entry).to be_new_record
38
90
  end
39
91
  end
40
92
 
@@ -47,26 +99,56 @@ describe Days::App, type: :controller do
47
99
  it_behaves_like 'an admin page'
48
100
 
49
101
  it "creates entry" do
50
- subject.should be_redirect
102
+ expect(subject).to be_redirect
51
103
 
52
- entry.title.should == "Hello"
53
- entry.body.should == "World"
54
- entry.user.should == user
104
+ entry = Days::Entry.last
105
+ expect(entry.title).to eq("Hello")
106
+ expect(entry.body).to eq("World")
107
+ expect(entry.user).to eq(user)
55
108
  end
56
109
 
57
110
  context "when entry is invalid" do
58
111
  before do
59
- Days::Entry.any_instance.stub(:valid? => false, :save => false)
112
+ allow_any_instance_of(Days::Entry).to receive_messages(:valid? => false, :save => false)
60
113
  end
61
114
 
62
- specify { subject.status.should == 406 } # not acceptable
115
+ specify { expect(subject.status).to eq(406) } # not acceptable
63
116
 
64
117
  it "renders form" do
65
- render[:data].should == :'admin/entries/form'
118
+ expect(render[:data]).to eq(:'admin/entries/form')
66
119
  ientry = render[:ivars][:@entry]
67
- ientry.should be_a_new_record
68
- ientry.title.should == 'Hello'
69
- ientry.body.should == 'World'
120
+ expect(ientry).to be_a_new_record
121
+ expect(ientry.title).to eq('Hello')
122
+ expect(ientry.body).to eq('World')
123
+ end
124
+ end
125
+
126
+ context "with config.html_pipeline" do
127
+ let(:pipeline) do
128
+ double('pipeline')
129
+ end
130
+
131
+ let(:entry) do
132
+ Days::Entry.new(entry_params)
133
+ end
134
+
135
+ before do
136
+ Days::App.config.html_pipeline = pipeline
137
+ allow(Days::Entry).to receive(:new).and_return(entry)
138
+ end
139
+
140
+ it "sets pipeline to entry" do
141
+ allow(entry).to receive(:save).and_wrap_original do |m, *args|
142
+ expect(entry.pipeline).to eq(pipeline)
143
+ entry.pipeline = nil
144
+ m.call
145
+ end
146
+
147
+ expect(subject).to be_redirect
148
+ end
149
+
150
+ after do
151
+ Days::App.config.html_pipeline = nil
70
152
  end
71
153
  end
72
154
 
@@ -79,11 +161,12 @@ describe Days::App, type: :controller do
79
161
  {entry: entry_params.merge(categories: categories)}
80
162
  end
81
163
 
82
- it { should be_redirect }
164
+ it { is_expected.to be_redirect }
83
165
 
84
166
  it "creates entry with categories" do
85
167
  subject
86
- entry.categories.reload.map(&:id).should == Days::Category.pluck(:id)
168
+ entry = Days::Entry.last
169
+ expect(entry.categories.reload.map(&:id)).to eq(Days::Category.pluck(:id))
87
170
  end
88
171
  end
89
172
  end
@@ -94,14 +177,14 @@ describe Days::App, type: :controller do
94
177
  it_behaves_like 'an admin page'
95
178
 
96
179
  it "renders form page" do
97
- render[:data].should == :'admin/entries/form'
98
- render[:ivars][:@entry].should == entry
180
+ expect(render[:data]).to eq(:'admin/entries/form')
181
+ expect(render[:ivars][:@entry]).to eq(entry)
99
182
  end
100
183
 
101
184
  context "with invalid entry" do
102
- let(:entry) { double.tap { |_| _.stub(id: Days::Entry.last.id.succ) } }
185
+ before { entry.destroy }
103
186
 
104
- it { should be_not_found }
187
+ it { is_expected.to be_not_found }
105
188
  end
106
189
  end
107
190
 
@@ -114,43 +197,71 @@ describe Days::App, type: :controller do
114
197
  it_behaves_like 'an admin page'
115
198
 
116
199
  it "updates entry" do
117
- subject.should be_redirect
118
- URI.parse(subject['Location']).path.should == path
200
+ expect(subject).to be_redirect
201
+ expect(URI.parse(subject['Location']).path).to eq(path)
119
202
 
120
203
  entry.reload
121
- entry.title.should == 'New'
122
- entry.body.should == 'a rainy day'
204
+ expect(entry.title).to eq('New')
205
+ expect(entry.body).to eq('foo')
123
206
  end
124
207
 
125
208
  context "when invalid" do
126
209
  before do
127
- Days::Entry.any_instance.stub(:valid? => false, :save => false)
210
+ allow_any_instance_of(Days::Entry).to receive_messages(:valid? => false, :save => false)
128
211
  end
129
212
 
130
213
  it "renders form" do
131
- render[:data].should == :'admin/entries/form'
214
+ expect(render[:data]).to eq(:'admin/entries/form')
132
215
  ientry = render[:ivars][:@entry]
133
- ientry.id.should == entry.id
134
- ientry.title.should == 'New'
135
- entry.title.should == 'Today was'
216
+ expect(ientry.id).to eq(entry.id)
217
+ expect(ientry.title).to eq('New')
218
+
219
+ entry.reload
220
+ expect(entry.title).to eq('foo')
136
221
  end
137
222
  end
138
223
 
139
224
  context "with category" do
225
+ let(:category) { Days::Category.create!(name: 'daily') }
140
226
  let(:params) do
141
- {entry: {categories: {categories(:rainy).id.to_s => '1'}}}
227
+ {entry: {categories: {category.id.to_s => '1'}}}
142
228
  end
143
229
 
144
230
  it "creates entry with categories" do
145
- subject.should be_redirect
146
- entry.categories.reload.map(&:id).should == [categories(:rainy).id]
231
+ expect(subject).to be_redirect
232
+ expect(entry.reload.categories.reload.map(&:id)).to eq([category.id])
147
233
  end
148
234
  end
149
235
 
150
236
  context "with invalid entry" do
151
- let(:entry) { double.tap { |_| _.stub(id: Days::Entry.last.id.succ) } }
237
+ before { entry.destroy }
238
+
239
+ it { is_expected.to be_not_found }
240
+ end
241
+
242
+ context "with config.html_pipeline" do
243
+ let(:pipeline) do
244
+ double('pipeline')
245
+ end
246
+
247
+ before do
248
+ Days::App.config.html_pipeline = pipeline
249
+ expect(Days::Entry).to receive(:find_by).with(id: entry.id.to_s).and_return(entry)
250
+ end
251
+
252
+ it "sets pipeline to entry" do
253
+ allow(entry).to receive(:save).and_wrap_original do |m, *args|
254
+ expect(entry.pipeline).to eq(pipeline)
255
+ entry.pipeline = nil
256
+ m.call
257
+ end
152
258
 
153
- it { should be_not_found }
259
+ expect(subject).to be_redirect
260
+ end
261
+
262
+ after do
263
+ Days::App.config.html_pipeline = nil
264
+ end
154
265
  end
155
266
  end
156
267
 
@@ -161,14 +272,14 @@ describe Days::App, type: :controller do
161
272
 
162
273
  it "destroys entry" do
163
274
  expect { subject }.to change { Days::Entry.where(id: entry.id).count }.from(1).to(0)
164
- subject.should be_redirect
165
- URI.parse(subject.location).path.should == "/admin/entries"
275
+ expect(subject).to be_redirect
276
+ expect(URI.parse(subject.location).path).to eq("/admin/entries")
166
277
  end
167
278
 
168
279
  context "with invalid entry" do
169
- let(:entry) { double.tap { |_| _.stub(id: Days::Entry.last.id.succ) } }
280
+ before { entry.destroy }
170
281
 
171
- it { should be_not_found }
282
+ it { is_expected.to be_not_found }
172
283
  end
173
284
  end
174
285
 
@@ -2,27 +2,18 @@ require 'spec_helper'
2
2
 
3
3
  describe Days::App, type: :controller do
4
4
  describe "admin: sessions" do
5
- let(:user) do
5
+ let!(:user) do
6
6
  Days::User.create(
7
7
  name: 'Blogger', login_name: 'blogger',
8
8
  password: 'password', password_confirmation: 'password'
9
9
  )
10
10
  end
11
11
 
12
- before do
13
- Days::User.destroy_all
14
- user
15
- end
16
-
17
- after do
18
- user.destroy
19
- end
20
-
21
12
  describe "GET /admin/login" do
22
13
  subject { get '/admin/login' }
23
14
 
24
15
  it "renders login page" do
25
- render[:data].should == :'admin/login'
16
+ expect(render[:data]).to eq(:'admin/login')
26
17
  end
27
18
  end
28
19
 
@@ -36,15 +27,15 @@ describe Days::App, type: :controller do
36
27
  end
37
28
 
38
29
  it "redirects to /admin" do
39
- subject.should be_redirect
40
- URI.parse(subject.location).path.should == '/admin'
30
+ expect(subject).to be_redirect
31
+ expect(URI.parse(subject.location).path).to eq('/admin')
41
32
  end
42
33
 
43
34
  context "without login name" do
44
35
  let(:params) { {password: 'password'} }
45
36
 
46
37
  specify do
47
- subject.status.should == 400
38
+ expect(subject.status).to eq(400)
48
39
  end
49
40
  end
50
41
 
@@ -52,7 +43,7 @@ describe Days::App, type: :controller do
52
43
  let(:params) { {login_name: 'blogger'} }
53
44
 
54
45
  specify do
55
- subject.status.should == 400
46
+ expect(subject.status).to eq(400)
56
47
  end
57
48
  end
58
49
 
@@ -61,12 +52,12 @@ describe Days::App, type: :controller do
61
52
 
62
53
  it "doesn't log in" do
63
54
  subject
64
- session[:user_id].should be_nil
55
+ expect(session[:user_id]).to be_nil
65
56
  end
66
57
 
67
58
  it "returns login page" do
68
- subject.status.should == 401
69
- render[:data].should == :'admin/login'
59
+ expect(subject.status).to eq(401)
60
+ expect(render[:data]).to eq(:'admin/login')
70
61
  end
71
62
  end
72
63
 
@@ -75,12 +66,12 @@ describe Days::App, type: :controller do
75
66
 
76
67
  it "doesn't log in" do
77
68
  subject
78
- session[:user_id].should be_nil
69
+ expect(session[:user_id]).to be_nil
79
70
  end
80
71
 
81
72
  it "returns login page" do
82
- subject.status.should == 401
83
- render[:data].should == :'admin/login'
73
+ expect(subject.status).to eq(401)
74
+ expect(render[:data]).to eq(:'admin/login')
84
75
  end
85
76
  end
86
77
  end
@@ -91,8 +82,8 @@ describe Days::App, type: :controller do
91
82
  before { login(user) }
92
83
 
93
84
  it "redirects to /admin/login" do
94
- subject.should be_redirect
95
- URI.parse(subject.location).path.should == '/admin/login'
85
+ expect(subject).to be_redirect
86
+ expect(URI.parse(subject.location).path).to eq('/admin/login')
96
87
  end
97
88
 
98
89
  specify do
@@ -102,8 +93,8 @@ describe Days::App, type: :controller do
102
93
 
103
94
  context "when not logged in" do
104
95
  it "redirects to /admin/login" do
105
- subject.should be_redirect
106
- URI.parse(subject.location).path.should == '/admin/login'
96
+ expect(subject).to be_redirect
97
+ expect(URI.parse(subject.location).path).to eq('/admin/login')
107
98
  end
108
99
  end
109
100
  end
@@ -3,10 +3,15 @@ require 'spec_helper'
3
3
  describe Days::App, type: :controller do
4
4
  shared_examples "an setup page" do
5
5
  context "when user exists" do
6
- fixtures :users
6
+ before do
7
+ Days::User.create!(
8
+ name: 'Blogger', login_name: 'blogger',
9
+ password: 'password', password_confirmation: 'password'
10
+ )
11
+ end
7
12
 
8
13
  it "denies access" do
9
- subject.status.should == 403
14
+ expect(subject.status).to eq(403)
10
15
  end
11
16
  end
12
17
  end
@@ -18,17 +23,13 @@ describe Days::App, type: :controller do
18
23
  it_behaves_like 'an setup page'
19
24
 
20
25
  context "when user not exists" do
21
- before do
22
- Days::User.destroy_all
23
- end
24
-
25
- it { should be_ok }
26
+ it { is_expected.to be_ok }
26
27
 
27
28
  it "renders form page" do
28
- render[:data].should == :'admin/setup'
29
+ expect(render[:data]).to eq(:'admin/setup')
29
30
  user = render[:ivars][:@user]
30
- user.should be_a(Days::User)
31
- user.should be_new_record
31
+ expect(user).to be_a(Days::User)
32
+ expect(user).to be_new_record
32
33
  end
33
34
  end
34
35
  end
@@ -43,40 +44,36 @@ describe Days::App, type: :controller do
43
44
  it_behaves_like 'an setup page'
44
45
 
45
46
  context "when user not exists" do
46
- before do
47
- Days::User.destroy_all
48
- end
49
-
50
47
  it "creates user" do
51
48
  expect { subject }.to change { Days::User.count }.from(0).to(1)
52
49
  user = Days::User.last
53
- user.name.should == "Newbie"
50
+ expect(user.name).to eq("Newbie")
54
51
  end
55
52
 
56
53
  it "logs in" do
57
- session[:user_id].should be_nil
54
+ expect(session[:user_id]).to be_nil
58
55
  subject
59
- session[:user_id].should == Days::User.last.id
56
+ expect(session[:user_id]).to eq(Days::User.last.id)
60
57
  end
61
58
 
62
59
  it "redirects to /admin" do
63
- subject.should be_redirect
64
- URI.parse(subject.location).path.should == '/admin'
60
+ expect(subject).to be_redirect
61
+ expect(URI.parse(subject.location).path).to eq('/admin')
65
62
  end
66
63
 
67
64
  context "when user is invalid" do
68
65
  before do
69
- Days::User.any_instance.stub(:valid? => false, :save => false)
66
+ allow_any_instance_of(Days::User).to receive_messages(:valid? => false, :save => false)
70
67
  end
71
68
 
72
- specify { subject.status.should == 406 } # not acceptable
69
+ specify { expect(subject.status).to eq(406) } # not acceptable
73
70
 
74
71
  it "renders form" do
75
- render[:data].should == :'admin/setup'
72
+ expect(render[:data]).to eq(:'admin/setup')
76
73
  iuser = render[:ivars][:@user]
77
- iuser.should be_a_new_record
78
- iuser.name.should == 'Newbie'
79
- iuser.login_name.should == 'newbie'
74
+ expect(iuser).to be_a_new_record
75
+ expect(iuser.name).to eq('Newbie')
76
+ expect(iuser.login_name).to eq('newbie')
80
77
  end
81
78
  end
82
79
  end