1
0
mirror of https://github.com/danbee/mpd-client synced 2025-03-04 08:39:09 +00:00

Add rspec and split out models.

This commit is contained in:
Dan Barber 2013-09-02 14:40:39 +01:00
parent abe7ad7626
commit 68042e18e0
8 changed files with 127 additions and 6 deletions

View File

@ -6,6 +6,15 @@ gem 'foreman'
gem 'ruby-mpd'
group :development, :test do
gem 'pry'
end
group :test do
gem 'rspec'
gem 'rspec-mocks'
end
group :development do
gem 'shotgun'
end

View File

@ -2,18 +2,33 @@ GEM
remote: https://rubygems.org/
specs:
backports (3.3.3)
coderay (1.0.9)
daemons (1.1.9)
diff-lcs (1.2.4)
dotenv (0.8.0)
eventmachine (1.0.3)
foreman (0.63.0)
dotenv (>= 0.7)
thor (>= 0.13.6)
method_source (0.8.2)
multi_json (1.7.9)
pry (0.9.12.2)
coderay (~> 1.0.5)
method_source (~> 0.8)
slop (~> 3.4)
rack (1.5.2)
rack-protection (1.5.0)
rack
rack-test (0.6.2)
rack (>= 1.0)
rspec (2.14.1)
rspec-core (~> 2.14.0)
rspec-expectations (~> 2.14.0)
rspec-mocks (~> 2.14.0)
rspec-core (2.14.5)
rspec-expectations (2.14.2)
diff-lcs (>= 1.1.3, < 2.0)
rspec-mocks (2.14.3)
ruby-mpd (0.2.4)
shotgun (0.9)
rack (>= 1.0)
@ -28,6 +43,7 @@ GEM
rack-test
sinatra (~> 1.4.0)
tilt (~> 1.3)
slop (3.4.6)
thin (1.5.1)
daemons (>= 1.0.9)
eventmachine (>= 0.12.6)
@ -40,6 +56,9 @@ PLATFORMS
DEPENDENCIES
foreman
pry
rspec
rspec-mocks
ruby-mpd
shotgun
sinatra

26
models/album.rb Normal file
View File

@ -0,0 +1,26 @@
require './models/mpd_connection'
class Album
attr_accessor :title, :genre, :year
def initialize(album)
first_song = MPDConnection.mpd.search(:album, album).first
@title = first_song.album
@genre = first_song.genre
@year = first_song.date
end
def self.by_artist(artist)
MPDConnection.mpd.albums(artist).map { |album| Album.new(album) }
end
def <=>(album)
year <=> album.year
end
def attributes
{ title: @title,
genre: @genre,
year: @year }
end
end

7
models/mpd_connection.rb Normal file
View File

@ -0,0 +1,7 @@
class MPDConnection
def self.mpd
@@mpd ||= MPD.new
@@mpd.connect unless @@mpd.connected?
@@mpd
end
end

View File

@ -1,9 +1,12 @@
require 'sinatra'
require "sinatra/namespace"
require 'bundler'
ENV['RACK_ENV'] ||= 'development'
Bundler.require(:default, ENV['RACK_ENV'])
require 'json'
require 'ruby-mpd'
require 'cgi'
require './models/album'
class MPDClient < Sinatra::Base
register Sinatra::Namespace
@ -55,9 +58,7 @@ class MPDClient < Sinatra::Base
end
def mpd
@mpd ||= MPD.new
@mpd.connect unless @mpd.connected?
@mpd
MPDConnection.mpd
end
end

31
spec/models/album_spec.rb Normal file
View File

@ -0,0 +1,31 @@
require 'spec_helper'
describe Album do
let(:song1) { MPD::Song.new({ album: 'Back in Black', genre: 'Rock', date: '1980' }) }
let(:song2) { MPD::Song.new({ album: 'Highway to Hell', genre: 'Rock', date: '1979' }) }
before do
MPDConnection.mpd.stub(:albums).and_return([song1.album, song2.album])
MPDConnection.mpd.stub(:search).and_return([song1, song2])
MPDConnection.mpd.stub(:search).with(:album, song1.album).and_return([song1])
MPDConnection.mpd.stub(:search).with(:album, song2.album).and_return([song2])
end
it 'has attributes based on first song' do
album = Album.new(song1.album)
expect(album.title).to eq(song1.album)
expect(album.genre).to eq(song1.genre)
expect(album.year).to eq(song1.date)
end
it 'should return a list of albums' do
expect(Album.by_artist('AC/DC')).to have(2).items
end
it 'should sort the albums by year' do
albums = Album.by_artist('AC/DC')
expect(albums.sort.map(&:year)).to eq(['1979', '1980'])
end
end

8
spec/mpd_client_spec.rb Normal file
View File

@ -0,0 +1,8 @@
require 'spec_helper'
describe MPDClient do
it 'should respond to GET' do
get '/'
expect(last_response.status).to eq(404)
end
end

20
spec/spec_helper.rb Normal file
View File

@ -0,0 +1,20 @@
ENV['RACK_ENV'] = 'test'
require File.join(File.dirname(__FILE__), '..', 'mpd_client.rb')
require 'sinatra'
require 'rack/test'
# setup test environment
set :environment, :test
set :run, false
set :raise_errors, true
set :logging, false
def app
MPDClient
end
RSpec.configure do |config|
config.include Rack::Test::Methods
end