Skip to content

Commit eae4ff6

Browse files
author
Matt Swanson
committed
dat multi-speed test suit; add factories; wire up story_controller
1 parent 7c118e6 commit eae4ff6

File tree

14 files changed

+145
-25
lines changed

14 files changed

+145
-25
lines changed

Gemfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ end
2323
group(:development, :testing) do
2424
gem "pry"
2525
gem "rspec"
26+
gem "rspec-html-matchers"
2627
gem "rack-test"
2728
gem "shotgun"
2829
gem "racksh"
30+
gem "faker"
2931
end

Gemfile.lock

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ GEM
4646
delayed_job (~> 3.0)
4747
diff-lcs (1.2.2)
4848
eventmachine (1.0.3)
49+
faker (1.0.1)
50+
i18n (~> 0.4)
4951
i18n (0.6.1)
5052
kgio (2.8.0)
5153
loofah (1.2.1)
@@ -75,6 +77,9 @@ GEM
7577
rspec-core (2.13.1)
7678
rspec-expectations (2.13.0)
7779
diff-lcs (>= 1.1.3, < 2.0)
80+
rspec-html-matchers (0.4.1)
81+
nokogiri (>= 1.4.4)
82+
rspec (>= 2.0.0)
7883
rspec-mocks (2.13.0)
7984
sax-machine (0.2.0.rc1)
8085
nokogiri (~> 1.5.2)
@@ -103,6 +108,7 @@ PLATFORMS
103108

104109
DEPENDENCIES
105110
delayed_job_active_record
111+
faker
106112
feedzirra!
107113
loofah
108114
pg
@@ -111,6 +117,7 @@ DEPENDENCIES
111117
racksh
112118
rake
113119
rspec
120+
rspec-html-matchers
114121
shotgun
115122
sinatra
116123
sinatra-activerecord

Rakefile

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Bundler.require
66
require "./app"
77
require_relative "./app/tasks/fetch_feeds"
88

9+
desc "Fetch all feeds."
910
task :fetch_feeds do
1011
FetchFeeds.new(Feed.all).fetch_all
1112
end
@@ -15,7 +16,17 @@ task :clear_jobs do
1516
Delayed::Job.delete_all
1617
end
1718

18-
desc 'delayed_job worker process'
19+
desc "Work the delayed_job queue."
1920
task :work_jobs do
2021
Delayed::Worker.new(:min_priority => ENV['MIN_PRIORITY'], :max_priority => ENV['MAX_PRIORITY']).start
21-
end
22+
end
23+
24+
require 'rspec/core/rake_task'
25+
26+
RSpec::Core::RakeTask.new(:speedy_tests) do |t|
27+
t.rspec_opts = "--tag ~speed:slow"
28+
end
29+
30+
RSpec::Core::RakeTask.new(:spec)
31+
32+
task :default => [:speedy_tests]

app.rb

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
require "sinatra/flash"
44
require "sinatra/contrib/all"
55

6-
require_relative "app/models/feed"
7-
require_relative "app/models/story"
8-
96
class Stringer < Sinatra::Base
107
configure do
118
set :database_file, "config/database.yml"
@@ -33,8 +30,8 @@ def render(*args)
3330
end
3431

3532
get "/" do
36-
@stories = Story.all.sample(5)
37-
38-
erb :index
33+
redirect to("/news")
3934
end
40-
end
35+
end
36+
37+
require_relative "app/controllers/stories_controller"
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
require_relative "../repositories/story_repository"
2+
3+
class Stringer < Sinatra::Base
4+
get "/news" do
5+
@unread_stories = StoryRepository.unread
6+
7+
erb :index
8+
end
9+
end

app/models/story.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require_relative "./feed"
2+
13
class Story < ActiveRecord::Base
24
belongs_to :feed
35

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1+
require_relative "../models/story"
2+
13
class StoryRepository
24
def self.add(entry, feed)
35
Story.create(feed: feed, title: entry.title, permalink: entry.url, body: entry.content.sanitize)
46
end
7+
8+
def self.unread
9+
Story.all
10+
end
511
end

app/tasks/fetch_feed.rb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,7 @@ def fetch
1414

1515
unless result.last_modified < @feed.last_fetched
1616
result.entries.each do |entry|
17-
begin
18-
StoryRepository.add(entry, @feed) if is_new?(entry)
19-
rescue
20-
require "pry"
21-
binding.pry
22-
end
17+
StoryRepository.add(entry, @feed) if is_new?(entry)
2318
end
2419

2520
FeedRepository.update_last_fetched(@feed, result.last_modified)

app/views/index.erb

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
11
<div id="action-bar">
22
<div class="row-fluid">
33
<div class="pull-left">
4-
<a class="btn">
4+
<a class="btn" id="mark-all">
55
<i class="icon-ok"></i>
66
</a>
7-
<a class="btn" href="/">
7+
<a class="btn" href="/" id="refresh">
88
<i class="icon-repeat"></i>
99
</a>
1010
</div>
1111

1212
<div class="pull-right">
13-
<a class="btn btn-primary">
13+
<a class="btn btn-primary" id="settings">
1414
<i class="icon-cog"></i>
1515
</a>
16-
<a class="btn btn-primary">
16+
<a class="btn btn-primary" id="add-feed">
1717
<i class="icon-plus"></i>
1818
</a>
1919
</div>
2020
</div>
2121
</div>
2222

23+
<% unless @unread_stories.empty? %>
2324
<div id="stories">
2425
<ul id="story-list">
25-
<% @stories.each do |story| %>
26+
<% @unread_stories.each do |story| %>
2627
<li class="story">
2728
<div class="row-fluid story-preview">
2829
<div class="span3">
@@ -61,4 +62,8 @@
6162
</li>
6263
<% end %>
6364
</ul>
64-
</div>
65+
</div>
66+
<% else %>
67+
<div id="zen">
68+
</div>
69+
<% end %>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
require "spec_helper"
2+
3+
app_require "controllers/stories_controller"
4+
5+
describe "StoriesController" do
6+
let(:story_one) { StoryFactory.build }
7+
let(:story_two) { StoryFactory.build }
8+
let(:stories) { [story_one, story_two] }
9+
10+
describe "/news" do
11+
before { StoryRepository.stub(:unread).and_return(stories) }
12+
13+
it "display list of unread stories" do
14+
get "/news"
15+
16+
last_response.body.should have_tag("li.story", count: 2)
17+
end
18+
19+
it "displays the blog title and article title" do
20+
StoryRepository.should_receive(:unread).and_return([story_one])
21+
22+
get "/news"
23+
24+
last_response.body.should include(story_one.headline)
25+
last_response.body.should include(story_one.source)
26+
end
27+
28+
it "displays all user actions" do
29+
get "/news"
30+
31+
last_response.body.should have_tag("#mark-all")
32+
last_response.body.should have_tag("#refresh")
33+
last_response.body.should have_tag("#settings")
34+
last_response.body.should have_tag("#add-feed")
35+
end
36+
37+
it "displays a zen-like message when there are no unread stories" do
38+
StoryRepository.stub(:unread).and_return([])
39+
40+
get "/news"
41+
42+
last_response.body.should have_tag("#zen")
43+
end
44+
end
45+
end

0 commit comments

Comments
 (0)