spec/xfrtuc_spec.rb in xfrtuc-0.0.3 vs spec/xfrtuc_spec.rb in xfrtuc-0.0.4
- old
+ new
@@ -1,5 +1,6 @@
+require 'securerandom'
require 'spec_helper'
require 'sham_rack'
module Xfrtuc
User = Struct.new(:name, :password)
@@ -82,11 +83,11 @@
transfers = @transfers[group_name]
[200, headers, [transfers.to_json]]
end
end
- def get_transfer(group_name, xfer_id, verbose: false)
+ def get_transfer(group_name, xfer_id, verbose=false)
group = @groups.find { |g| g[:name] == group_name }
if group.nil?
[404, headers, []]
elsif group[:deleted]
[409, headers, []]
@@ -125,10 +126,37 @@
@transfers[group_name].delete xfer
return [200, headers, [ xfer.to_json ]]
end
end
+ def take_transfer_action(action, args, group_name, xfer_id)
+ unless @transfers.has_key? group_name
+ return [404, headers, []]
+ end
+ xfer = @transfers[group_name].find { |item| item[:uuid] == xfer_id }
+ if xfer.nil?
+ return [404, headers, []]
+ else
+ case action
+ when 'cancel' then
+ now = Time.now
+ xfer[:canceled_at] = now
+ return [201, headers, [ { canceled_at: now }.to_json ]]
+ when 'public-url' then
+ expires_at = if args.has_key? 'ttl'
+ Time.now + args['ttl'].to_i
+ else
+ Time.now + (10 * 60)
+ end
+ url = "https://example.com/backup/#{xfer[:uuid]}"
+ return [201, headers, [ { url: url, expires_at: expires_at }.to_json ]]
+ else
+ return [404, headers, []]
+ end
+ end
+ end
+
def add_schedule(group_name, schedule)
unless @schedules.has_key? group_name
return [404, headers, []]
end
sched = { uuid: SecureRandom.uuid }
@@ -183,10 +211,12 @@
def call(env)
unless verify_auth(env)
return [401, headers, ["Not authorized"]]
end
case path(env)
+ when %r{/groups/[^/]+/transfers/[^/]+/actions} then
+ transfers_actions_endpoint(env)
when %r{/groups/[^/]+/transfers} then
transfers_endpoint(env)
when %r{/groups/[^/]+/schedules} then
schedules_endpoint(env)
when %r{/groups} then
@@ -194,10 +224,24 @@
else
[404, headers, []]
end
end
+ def transfers_actions_endpoint(env)
+ path = path(env)
+ group_name, xfer_id, action =
+ path.match(%r{\A/groups/(.*)/transfers/(.*)/actions/(.*)\z}) && [$1, $2, $3]
+ verb = verb(env)
+ if verb == 'POST'
+ body = body(env)
+ args = JSON.parse(body) unless body.empty?
+ take_transfer_action(action, args, group_name, xfer_id)
+ else
+ [405, headers, []]
+ end
+ end
+
def transfers_endpoint(env)
path = path(env)
group_name, xfer_id = path.match(%r{\A/groups/(.*)/transfers(?:/(.*))?\z}) && [$1, $2]
verb = verb(env)
if verb == 'POST'
@@ -214,11 +258,11 @@
delete_transfer(group_name, xfer_id)
elsif verb == 'GET'
if xfer_id.nil?
list_transfers(group_name)
else
- get_transfer(group_name, xfer_id, verbose: params(env)['verbose'] == 'true')
+ get_transfer(group_name, xfer_id, params(env)['verbose'] == 'true')
end
else
[405, headers, []]
end
end
@@ -346,11 +390,11 @@
let(:username) { 'vivian' }
let(:password) { 'hunter2' }
let(:user) { User.new(username, password) }
let(:fakesferatu) { FakeTransferatu.new(user) }
let(:host) { 'transferatu.example.com' }
- let(:client) { Client.new(username, password, base_url: "https://#{host}") }
+ let(:client) { Client.new(username, password, "https://#{host}") }
before do
ShamRack.mount(fakesferatu, host, 443)
end
@@ -478,9 +522,43 @@
it "deletes the given transfer" do
id = fakesferatu.last_transfer(g)[:uuid]
client.group(g).transfer.delete(id)
expect(fakesferatu.last_transfer(g)).to be_nil
+ end
+ end
+
+ describe "#cancel" do
+ before do
+ fakesferatu.add_transfer(g, Hash[xfer_data.map { |k, v| [k.to_s, v] }])
+ end
+
+ it "cancels the given transfer" do
+ id = fakesferatu.last_transfer(g)[:uuid]
+ before = Time.now
+ cancel_data = client.group(g).transfer.cancel(id)
+ canceled_at = Time.parse(cancel_data["canceled_at"])
+ expect(canceled_at).to be_within(60).of(before)
+ end
+ end
+
+ describe "#public_url" do
+ before do
+ fakesferatu.add_transfer(g, Hash[xfer_data.map { |k, v| [k.to_s, v] }])
+ end
+
+ it "provides a public url for the given transfer" do
+ id = fakesferatu.last_transfer(g)[:uuid]
+ url_data = client.group(g).transfer.public_url(id)
+ expect { URI.parse(url_data["url"]) }.not_to raise_error
+ end
+
+ it "supports an optional ttl parameter" do
+ id = fakesferatu.last_transfer(g)[:uuid]
+ before = Time.now
+ url_data = client.group(g).transfer.public_url(id, ttl: 5 * 60)
+ expires_at = Time.parse(url_data["expires_at"])
+ expect(expires_at).to be_within(60).of(before + (5 * 60))
end
end
end
describe Schedule do