spec/kamerling/http_api_spec.rb in kamerling-0.0.2 vs spec/kamerling/http_api_spec.rb in kamerling-0.0.3
- old
+ new
@@ -1,93 +1,114 @@
require 'nokogiri'
-
require_relative '../spec_helper'
+require_relative '../../lib/kamerling/client'
+require_relative '../../lib/kamerling/http_api'
+require_relative '../../lib/kamerling/project'
+require_relative '../../lib/kamerling/repos'
+require_relative '../../lib/kamerling/task'
+require_relative '../../lib/kamerling/task_dispatcher'
+require_relative '../../lib/kamerling/uuid'
-module Kamerling describe HTTPAPI do
- let(:app) { HTTPAPI.set repos: repos }
- let(:doc) { Nokogiri::HTML last_response.body }
- let(:ecc) { fake :project, uuid: UUID.new }
- let(:gimps) { fake :project, uuid: UUID.new }
- let(:repos) { fake :repos, as: :class, projects: [gimps, ecc] }
+module Kamerling
+ describe HTTPAPI do
+ let(:app) { HTTPAPI.set(repos: repos, task_dispatcher: task_dispatcher) }
+ let(:doc) { Nokogiri::HTML(last_response.body) }
+ let(:ecc) { Project.new }
+ let(:gimps) { Project.new }
+ let(:repos) { fake(:repos, as: :class, projects: [gimps, ecc]) }
+ let(:task_dispatcher) { fake(:task_dispatcher) }
- describe 'GET /' do
- it 'contains links to clients and projects' do
- get '/'
- doc.at('#clients')['href'].must_equal '/clients'
- doc.at('#projects')['href'].must_equal '/projects'
+ describe 'GET /' do
+ it 'contains links to clients and projects' do
+ get '/'
+ doc.at('#clients')['href'].must_equal '/clients'
+ doc.at('#projects')['href'].must_equal '/projects'
+ end
end
- end
- describe 'GET /clients' do
- it 'contains links to and UUIDs of clients' do
- fpga = fake :client, uuid: UUID.new
- stub(repos).clients { [fpga] }
- get '/clients'
- links = doc.css '#clients a[rel=client]'
- links.size.must_equal 1
- links.at("[data-uuid='#{fpga.uuid}']")['href']
- .must_equal "/clients/#{fpga.uuid}"
+ describe 'GET /clients' do
+ it 'contains information on clients' do
+ addr = Addr['127.0.0.1', 1981, :TCP]
+ fpga = Client.new(addr: addr, busy: true, type: :FPGA)
+ stub(repos).clients { [fpga] }
+ get '/clients'
+ links = doc.css('#clients a[data-class=client]')
+ links.first['data-addr'].must_equal 'tcp://127.0.0.1:1981'
+ links.first['data-busy'].must_equal 'true'
+ links.first['data-type'].must_equal 'FPGA'
+ links.first['data-uuid'].must_equal fpga.uuid
+ links.first['href'].must_equal "/clients/#{fpga.uuid}"
+ end
end
- end
- describe 'GET /projects' do
- it 'contains links to and UUIDs of projects' do
- get '/projects'
- links = doc.css '#projects a[rel=project]'
- links.size.must_equal 2
- links.at("[data-uuid='#{gimps.uuid}']")['href']
- .must_equal "/projects/#{gimps.uuid}"
+ describe 'GET /projects' do
+ it 'contains links to and UUIDs of projects' do
+ get '/projects'
+ links = doc.css('#projects a[data-class=project]')
+ links.size.must_equal 2
+ links.at("[data-uuid='#{gimps.uuid}']")['href']
+ .must_equal "/projects/#{gimps.uuid}"
+ end
end
- end
- describe 'GET /projects/{uuid}' do
- let(:cpu) { fake :client, busy: false, uuid: UUID.new }
- let(:gpu) { fake :client, busy: true, uuid: UUID.new }
- let(:three) { fake :task, done: false, uuid: UUID.new }
- let(:seven) { fake :task, done: true, uuid: UUID.new }
+ describe 'GET /projects/{uuid}' do
+ let(:cpu) { Client.new(busy: false, type: :CPU) }
+ let(:gpu) { Client.new(busy: true, type: :GPU) }
+ let(:three) { Task.new(done: false) }
+ let(:seven) { Task.new(done: true) }
- before do
- stub(repos).project(gimps.uuid) { gimps }
- stub(repos).clients_for(gimps) { [cpu, gpu] }
- stub(repos).tasks_for(gimps) { [three, seven] }
- end
+ before do
+ stub(repos).project(gimps.uuid) { gimps }
+ stub(repos).clients_for(gimps) { [cpu, gpu] }
+ stub(repos).tasks_for(gimps) { [three, seven] }
+ end
- it 'contains links to and info on the project’s clients' do
- get "/projects/#{gimps.uuid}"
- links = doc.css '#clients a[rel=client]'
- links.size.must_equal 2
- links.at("[data-uuid='#{cpu.uuid}']")['href']
- .must_equal "/clients/#{cpu.uuid}"
- links.at("[data-uuid='#{cpu.uuid}']")['data-busy'].must_equal 'false'
- links.at("[data-uuid='#{gpu.uuid}']")['data-busy'].must_equal 'true'
- end
+ it 'contains links to and info on the project’s clients' do
+ get "/projects/#{gimps.uuid}"
+ links = doc.css('#clients a[data-class=client]')
+ links.size.must_equal 2
+ links.at("[data-uuid='#{cpu.uuid}']")['href']
+ .must_equal "/clients/#{cpu.uuid}"
+ links.at("[data-uuid='#{cpu.uuid}']")['data-busy'].must_equal 'false'
+ links.at("[data-uuid='#{gpu.uuid}']")['data-busy'].must_equal 'true'
+ links.at("[data-uuid='#{cpu.uuid}']")['data-type'].must_equal 'CPU'
+ links.at("[data-uuid='#{gpu.uuid}']")['data-type'].must_equal 'GPU'
+ end
- it 'contains links to and info on the project’s tasks' do
- get "/projects/#{gimps.uuid}"
- links = doc.css '#tasks a[rel=task]'
- links.size.must_equal 2
- links.at("[data-uuid='#{three.uuid}']")['href']
- .must_equal "/tasks/#{three.uuid}"
- links.at("[data-uuid='#{three.uuid}']")['data-done'].must_equal 'false'
- links.at("[data-uuid='#{seven.uuid}']")['data-done'].must_equal 'true'
+ it 'contains links to and info on the project’s tasks' do
+ get "/projects/#{gimps.uuid}"
+ links = doc.css('#tasks a[data-class=task]')
+ links.size.must_equal 2
+ links.at("[data-uuid='#{three.uuid}']")['href']
+ .must_equal "/tasks/#{three.uuid}"
+ links.at("[data-uuid='#{three.uuid}']")['data-done'].must_equal 'false'
+ links.at("[data-uuid='#{seven.uuid}']")['data-done'].must_equal 'true'
+ end
end
- end
- describe 'POST /projects' do
- it 'creates a new project with the given name and UUID' do
- post '/projects', name: 'ECC', uuid: uuid = UUID.new
- repos.must_have_received :<<, [Project.new(name: 'ECC', uuid: uuid)]
- end
+ describe 'POST /projects' do
+ it 'creates a new project with the given name and UUID' do
+ post '/projects', name: 'ECC', uuid: uuid = UUID.new
+ repos.must_have_received :<<, [Project.new(name: 'ECC', uuid: uuid)]
+ end
- it 'creates a new project with a random UUID if missing' do
- post '/projects', name: 'ECC'
- project = Project.new name: 'ECC', uuid: any(String)
- repos.must_have_received :<<, [project]
+ it 'redirects to /projects' do
+ post '/projects', name: 'ECC', uuid: UUID.new
+ follow_redirect!
+ URI(last_request.url).path.must_equal '/projects'
+ end
end
- it 'redirects to /projects' do
- post '/projects', name: 'ECC'
- follow_redirect!
- URI(last_request.url).path.must_equal '/projects'
+ describe 'POST /projects/dispatch' do
+ it 'dispatches tasks to all free clients' do
+ post '/projects/dispatch'
+ task_dispatcher.must_have_received :dispatch_all, []
+ end
+
+ it 'redirects to /projects' do
+ post '/projects/dispatch'
+ follow_redirect!
+ URI(last_request.url).path.must_equal '/projects'
+ end
end
end
-end end
+end