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