bitcoin 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- metadata +17 -288
- data/.rspec +0 -1
- data/.rvmrc +0 -1
- data/Gemfile +0 -4
- data/Gemfile.lock +0 -98
- data/Guardfile +0 -38
- data/README.markdown +0 -24
- data/Rakefile +0 -1
- data/bin/rbcoin +0 -8
- data/bitcoin.gemspec +0 -40
- data/config/cucumber.yml +0 -5
- data/config/darcs.boring +0 -121
- data/doc/DEFINITION_OF_DONE.markdown +0 -12
- data/doc/HISTORY.markdown +0 -19
- data/doc/LICENCE.markdown +0 -25
- data/doc/TODO.markdown +0 -31
- data/doc/UBIQUITOUS_LANGUAGE.markdown +0 -15
- data/features/descriptions/command_help.feature +0 -31
- data/features/descriptions/satoshi_wallet/add_address.feature +0 -49
- data/features/descriptions/satoshi_wallet/show_addresses.feature +0 -18
- data/features/descriptions/satoshi_wallet/show_version.feature +0 -17
- data/features/descriptions/satoshi_wallet/subcommand_help.feature +0 -20
- data/features/fixtures/ABOUT_FIXTURES.markdown +0 -6
- data/features/fixtures/addressbook_wallet.dat +0 -0
- data/features/fixtures/new_wallet.dat +0 -0
- data/features/step_definitions/command_steps.rb +0 -3
- data/features/step_definitions/wallet_steps.rb +0 -11
- data/features/support/env.rb +0 -9
- data/lib/bitcoin.rb +0 -5
- data/lib/bitcoin/cli.rb +0 -35
- data/lib/bitcoin/commands.rb +0 -3
- data/lib/bitcoin/commands/help_command.rb +0 -32
- data/lib/bitcoin/commands/satoshi_wallet.rb +0 -11
- data/lib/bitcoin/commands/satoshi_wallet/add_address_command.rb +0 -61
- data/lib/bitcoin/commands/satoshi_wallet/show_addresses_command.rb +0 -16
- data/lib/bitcoin/commands/satoshi_wallet/show_version_command.rb +0 -15
- data/lib/bitcoin/commands/satoshi_wallet_command.rb +0 -37
- data/lib/bitcoin/commands/satoshi_wallet_command_environment.rb +0 -28
- data/lib/bitcoin/console/capturing_stream_bundle.rb +0 -42
- data/lib/bitcoin/console/stream_bundle.rb +0 -21
- data/lib/bitcoin/data_access/satoshi/bdb_satoshi_wallet_repository.rb +0 -155
- data/lib/bitcoin/data_access/satoshi/satoshi_version.rb +0 -58
- data/lib/bitcoin/data_access/satoshi/satoshi_wallet.rb +0 -39
- data/lib/bitcoin/domain/address_book.rb +0 -19
- data/lib/bitcoin/domain/bitcoin_address.rb +0 -33
- data/lib/bitcoin/filesystem/empty_temp_dir.rb +0 -74
- data/lib/bitcoin/rspec/argument_matchers.rb +0 -1
- data/lib/bitcoin/rspec/argument_matchers/block_evaluating_to_matcher.rb +0 -23
- data/lib/bitcoin/rspec/directory_helpers.rb +0 -22
- data/lib/bitcoin/version.rb +0 -3
- data/spec/bitcoin/cli_spec.rb +0 -128
- data/spec/bitcoin/commands/help_command_spec.rb +0 -53
- data/spec/bitcoin/commands/satoshi_wallet/add_address_command_spec.rb +0 -149
- data/spec/bitcoin/commands/satoshi_wallet/show_addresses_command_spec.rb +0 -26
- data/spec/bitcoin/commands/satoshi_wallet/show_version_command_spec.rb +0 -26
- data/spec/bitcoin/commands/satoshi_wallet_command_environment_spec.rb +0 -76
- data/spec/bitcoin/commands/satoshi_wallet_command_spec.rb +0 -73
- data/spec/bitcoin/console/_contracts/stream_bundle_contract.rb +0 -29
- data/spec/bitcoin/console/capturing_stream_bundle_spec.rb +0 -74
- data/spec/bitcoin/console/stream_bundle_spec.rb +0 -13
- data/spec/bitcoin/data_access/satoshi/bdb_satoshi_wallet_repository_spec.rb +0 -78
- data/spec/bitcoin/data_access/satoshi/satoshi_version_spec.rb +0 -112
- data/spec/bitcoin/data_access/satoshi/satoshi_wallet_spec.rb +0 -102
- data/spec/bitcoin/domain/address_book_spec.rb +0 -63
- data/spec/bitcoin/domain/bitcoin_address_spec.rb +0 -52
- data/spec/bitcoin/filesystem/empty_temp_dir_spec.rb +0 -170
- data/spec/bitcoin/rspec/argument_matchers/block_evaluating_to_matcher_spec.rb +0 -36
- data/spec/spec_helper.rb +0 -29
@@ -1,149 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
require 'bitcoin/commands/satoshi_wallet/add_address_command'
|
6
|
-
|
7
|
-
# Dependencies required only in the spec
|
8
|
-
require 'bitcoin/console/capturing_stream_bundle'
|
9
|
-
require 'bitcoin/data_access/satoshi/satoshi_wallet'
|
10
|
-
|
11
|
-
module Bitcoin
|
12
|
-
module Commands
|
13
|
-
module SatoshiWallet
|
14
|
-
describe AddAddressCommand do
|
15
|
-
let(:stream_bundle) { Console::CapturingStreamBundle.test_bundle }
|
16
|
-
let(:wallet) { mock(DataAccess::Satoshi::SatoshiWallet, add_address: nil) }
|
17
|
-
|
18
|
-
let(:subject) { AddAddressCommand.new(stream_bundle) }
|
19
|
-
|
20
|
-
context "the input args are valid" do
|
21
|
-
def run_command
|
22
|
-
subject.run(wallet, args: [ "14Z1mazY4HfysZyMaKudFr63EwHqQT2njz", "Bitcoin Monitor" ])
|
23
|
-
end
|
24
|
-
|
25
|
-
it "adds the address" do
|
26
|
-
wallet.should_receive(:add_address).with(
|
27
|
-
Domain::BitcoinAddress.new("14Z1mazY4HfysZyMaKudFr63EwHqQT2njz"),
|
28
|
-
name: "Bitcoin Monitor"
|
29
|
-
)
|
30
|
-
run_command
|
31
|
-
end
|
32
|
-
|
33
|
-
it "informs the user that the address was added" do
|
34
|
-
run_command
|
35
|
-
stream_bundle.captured_output.should eq "Address added successfully\n"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context "the input args are invalid" do
|
40
|
-
context "missing arguments" do
|
41
|
-
invalid_arg_sets = [
|
42
|
-
%w[ ], # Pressed enter too soon
|
43
|
-
%w[ 14Z1mazY4HfysZyMaKudFr63EwHqQT2njz ] # Missing name
|
44
|
-
]
|
45
|
-
|
46
|
-
invalid_arg_sets.each do |invalid_args|
|
47
|
-
it "prints an error message" do
|
48
|
-
expect {
|
49
|
-
subject.run(wallet, args: invalid_args)
|
50
|
-
}.to raise_error
|
51
|
-
|
52
|
-
stream_bundle.captured_error.should include("You must provide both a Bitcoin address and a name to add to a wallet")
|
53
|
-
stream_bundle.captured_error.should =~ /No changes were made to the wallet\n\Z/
|
54
|
-
end
|
55
|
-
|
56
|
-
it "raises an error" do
|
57
|
-
expect {
|
58
|
-
subject.run(wallet, args: invalid_args)
|
59
|
-
}.to raise_error(CLI::CommandError)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context "too many args" do
|
65
|
-
def run_command
|
66
|
-
subject.run(wallet, args: %w[ 14Z1mazY4HfysZyMaKudFr63EwHqQT2njz foo bar baz ])
|
67
|
-
end
|
68
|
-
|
69
|
-
it "prints a helpful error message" do
|
70
|
-
expect { run_command }.to raise_error
|
71
|
-
|
72
|
-
stream_bundle.captured_error.should include(
|
73
|
-
-%{
|
74
|
-
Received too many arguments
|
75
|
-
|
76
|
-
To make sure the name is formatted correctly we ask you to use use quotes
|
77
|
-
around the name, e.g.: "foo bar baz"
|
78
|
-
|
79
|
-
No changes were made to the wallet
|
80
|
-
}
|
81
|
-
)
|
82
|
-
stream_bundle.captured_error.should =~ /\n\Z/
|
83
|
-
end
|
84
|
-
|
85
|
-
it "raises an error" do
|
86
|
-
expect { run_command }.to raise_error(CLI::CommandError)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
context "invalid Bitcoin address" do
|
91
|
-
def run_command
|
92
|
-
subject.run(wallet, args: [ "Invalid Bitcoin address", "Bitcoin Monitor" ])
|
93
|
-
end
|
94
|
-
|
95
|
-
it "prints an error message" do
|
96
|
-
expect {
|
97
|
-
run_command
|
98
|
-
}.to raise_error
|
99
|
-
|
100
|
-
# Ugh! There's got to be a better way of getting the error message than this,
|
101
|
-
# hopefully without having to stub out the creating of a value object...
|
102
|
-
expected_error =
|
103
|
-
begin
|
104
|
-
Domain::BitcoinAddress.new("Invalid Bitcoin address")
|
105
|
-
rescue Domain::BitcoinAddress::InvalidBitcoinAddressError => error
|
106
|
-
error.message
|
107
|
-
end
|
108
|
-
|
109
|
-
stream_bundle.captured_error.should include(error.message)
|
110
|
-
stream_bundle.captured_error.should =~ /The address was not added to the wallet\n\Z/
|
111
|
-
end
|
112
|
-
|
113
|
-
it "raises an error" do
|
114
|
-
expect {
|
115
|
-
run_command
|
116
|
-
}.to raise_error(CLI::CommandError)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
# This is paranoid, but currently we don't handle string length properly in the Berkeley DB code
|
121
|
-
# (This error handling is not publically documented)
|
122
|
-
context "excessively long names" do
|
123
|
-
string_253_bytes_long = "#{"☃" * 84}."
|
124
|
-
|
125
|
-
define_method :run_command do
|
126
|
-
subject.run(wallet, args: [ "14Z1mazY4HfysZyMaKudFr63EwHqQT2njz", string_253_bytes_long ])
|
127
|
-
end
|
128
|
-
|
129
|
-
it "prints an error message" do
|
130
|
-
expect {
|
131
|
-
run_command
|
132
|
-
}.to raise_error
|
133
|
-
|
134
|
-
stream_bundle.captured_error.should include(%'The address name "#{string_253_bytes_long}" is too long\n')
|
135
|
-
stream_bundle.captured_error.should include("Currently we do not allow address names over 252 bytes long\n")
|
136
|
-
stream_bundle.captured_error.should =~ /The address was not added to the wallet\n\Z/
|
137
|
-
end
|
138
|
-
|
139
|
-
it "raises an error" do
|
140
|
-
expect {
|
141
|
-
run_command
|
142
|
-
}.to raise_error(CLI::CommandError)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'bitcoin/commands/satoshi_wallet/show_addresses_command'
|
4
|
-
|
5
|
-
# Dependencies required only in the spec
|
6
|
-
require 'bitcoin/console/capturing_stream_bundle'
|
7
|
-
require 'bitcoin/data_access/satoshi/satoshi_wallet'
|
8
|
-
|
9
|
-
module Bitcoin
|
10
|
-
module Commands
|
11
|
-
module SatoshiWallet
|
12
|
-
describe ShowAddressesCommand do
|
13
|
-
let(:stream_bundle) { Console::CapturingStreamBundle.test_bundle }
|
14
|
-
let(:address_book) { mock(Domain::AddressBook, to_s: "addresses") }
|
15
|
-
let(:wallet) { mock(DataAccess::Satoshi::SatoshiWallet, addresses: address_book) }
|
16
|
-
|
17
|
-
let(:subject) { ShowAddressesCommand.new(stream_bundle) }
|
18
|
-
|
19
|
-
it "prints the addresses to the output stream" do
|
20
|
-
subject.run(wallet, wallet_filename: "wallet.dat")
|
21
|
-
stream_bundle.captured_output.should eq "# All addresses in wallet.dat\naddresses\n"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'bitcoin/commands/satoshi_wallet/show_version_command'
|
4
|
-
|
5
|
-
# Dependencies required only in the spec
|
6
|
-
require 'bitcoin/console/capturing_stream_bundle'
|
7
|
-
require 'bitcoin/data_access/satoshi/satoshi_version'
|
8
|
-
require 'bitcoin/data_access/satoshi/satoshi_wallet'
|
9
|
-
|
10
|
-
module Bitcoin
|
11
|
-
module Commands
|
12
|
-
module SatoshiWallet
|
13
|
-
describe ShowVersionCommand do
|
14
|
-
let(:stream_bundle) { Console::CapturingStreamBundle.test_bundle }
|
15
|
-
let(:wallet) { mock(DataAccess::Satoshi::SatoshiWallet, version: DataAccess::Satoshi::SatoshiVersion.new(0, 3, 24)) }
|
16
|
-
|
17
|
-
let(:subject) { ShowVersionCommand.new(stream_bundle) }
|
18
|
-
|
19
|
-
it "prints the wallet's version" do
|
20
|
-
subject.run(wallet)
|
21
|
-
stream_bundle.captured_output.should eq "0.3.24\n"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'bitcoin/commands/satoshi_wallet_command_environment'
|
4
|
-
|
5
|
-
# Dependencies required only in the spec
|
6
|
-
require 'bitcoin/data_access/satoshi/satoshi_wallet'
|
7
|
-
require 'bitcoin/console/capturing_stream_bundle'
|
8
|
-
|
9
|
-
module Bitcoin
|
10
|
-
module Commands
|
11
|
-
describe SatoshiWalletCommandEnvironment do
|
12
|
-
include FakeFS::SpecHelpers
|
13
|
-
|
14
|
-
let(:empty_temp_dir) { mock(FileSystem::EmptyTempDir, absolute_path: "/path/to/temp/dir") }
|
15
|
-
let(:satoshi_wallet) { mock(DataAccess::Satoshi::SatoshiWallet) }
|
16
|
-
|
17
|
-
before(:each) do
|
18
|
-
FileSystem::EmptyTempDir.stub(:open).and_yield(empty_temp_dir)
|
19
|
-
DataAccess::Satoshi::SatoshiWallet.stub(:open).and_yield(satoshi_wallet)
|
20
|
-
end
|
21
|
-
|
22
|
-
let(:command) { mock(Commands::SatoshiWallet, run: nil) }
|
23
|
-
let(:stream_bundle) { Console::CapturingStreamBundle.test_bundle }
|
24
|
-
|
25
|
-
subject { SatoshiWalletCommandEnvironment.new(stream_bundle) }
|
26
|
-
|
27
|
-
context "the wallet file exists" do
|
28
|
-
before(:each) { File.open("wallet.dat", "w") { |file| file << "unused wallet data" } }
|
29
|
-
|
30
|
-
it "create temp dir" do
|
31
|
-
FileSystem::EmptyTempDir.should_receive(:open).with(with_name: "bitcoinrb_db_tmp", parallel_to: PROJECT_ROOT + "/wallet.dat")
|
32
|
-
subject.run_command(command, %w[ wallet.dat foo bar ])
|
33
|
-
end
|
34
|
-
|
35
|
-
it "opens the wallet" do
|
36
|
-
DataAccess::Satoshi::SatoshiWallet.should_receive(:open).with(
|
37
|
-
wallet_filename: File.join(PROJECT_ROOT, "/wallet.dat"), # because this is the directory the specs run in
|
38
|
-
db_dirname: "/path/to/temp/dir"
|
39
|
-
)
|
40
|
-
subject.run_command(command, %w[ wallet.dat foo bar ])
|
41
|
-
end
|
42
|
-
|
43
|
-
it "runs the command" do
|
44
|
-
command.should_receive(:run).with(satoshi_wallet, wallet_filename: "wallet.dat", args: %w[ foo bar ])
|
45
|
-
subject.run_command(command, %w[ wallet.dat foo bar ])
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context "the wallet file does not exist" do
|
50
|
-
it "prints an error" do
|
51
|
-
expect {
|
52
|
-
subject.run_command(command, %w[ missing_wallet.dat foo bar ])
|
53
|
-
}.to raise_error
|
54
|
-
|
55
|
-
stream_bundle.captured_error.should eq "Couldn't find wallet file: missing_wallet.dat\n"
|
56
|
-
end
|
57
|
-
|
58
|
-
it "raises a CLI::CommandError" do
|
59
|
-
expect {
|
60
|
-
subject.run_command(command, %w[ missing_wallet.dat foo bar ])
|
61
|
-
}.to raise_error(CLI::CommandError)
|
62
|
-
end
|
63
|
-
|
64
|
-
it "does not attempt the rest of the code" do
|
65
|
-
# Although this does involve a lot of knowledge about the code, as
|
66
|
-
# it's not immediately obvious why this proves nothing else is run
|
67
|
-
FileSystem::EmptyTempDir.should_not_receive(:open)
|
68
|
-
|
69
|
-
expect {
|
70
|
-
subject.run_command(command, %w[ missing_wallet.dat foo bar ])
|
71
|
-
}.to raise_error
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'bitcoin/commands/satoshi_wallet_command'
|
4
|
-
|
5
|
-
# Dependencies only used in the spec
|
6
|
-
require 'bitcoin/domain/address_book'
|
7
|
-
require 'bitcoin/console/capturing_stream_bundle'
|
8
|
-
require 'bitcoin/commands/satoshi_wallet_command_environment'
|
9
|
-
|
10
|
-
module Bitcoin
|
11
|
-
module Commands
|
12
|
-
describe SatoshiWalletCommand do
|
13
|
-
let(:stream_bundle) { Console::CapturingStreamBundle.test_bundle }
|
14
|
-
let(:command_environment) { mock(SatoshiWalletCommandEnvironment, run_command: nil) }
|
15
|
-
|
16
|
-
subject { SatoshiWalletCommand.new(stream_bundle, command_environment) }
|
17
|
-
|
18
|
-
describe "#run" do
|
19
|
-
shared_examples_for "SatoshiWalletCommand#run" do |options|
|
20
|
-
let(:command) { mock(options[:command_class]) }
|
21
|
-
|
22
|
-
before(:each) do
|
23
|
-
options[:command_class].stub(new: command)
|
24
|
-
end
|
25
|
-
|
26
|
-
it "makes a command" do
|
27
|
-
options[:command_class].should_receive(:new).with(stream_bundle)
|
28
|
-
subject.run([ options[:command_name], "wallet.dat", "foo", "bar" ])
|
29
|
-
end
|
30
|
-
|
31
|
-
it "runs the command" do
|
32
|
-
command_environment.should_receive(:run_command).with(command, %w[ wallet.dat foo bar ])
|
33
|
-
subject.run([ options[:command_name], "wallet.dat", "foo", "bar" ])
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context "show-version" do
|
38
|
-
it_behaves_like "SatoshiWalletCommand#run",
|
39
|
-
command_name: "show-version",
|
40
|
-
command_class: Commands::SatoshiWallet::ShowVersionCommand
|
41
|
-
end
|
42
|
-
|
43
|
-
context "show-addresses" do
|
44
|
-
it_behaves_like "SatoshiWalletCommand#run",
|
45
|
-
command_name: "show-addresses",
|
46
|
-
command_class: Commands::SatoshiWallet::ShowAddressesCommand
|
47
|
-
end
|
48
|
-
|
49
|
-
context "add-address" do
|
50
|
-
it_behaves_like "SatoshiWalletCommand#run",
|
51
|
-
command_name: "add-address",
|
52
|
-
command_class: Commands::SatoshiWallet::AddAddressCommand
|
53
|
-
end
|
54
|
-
|
55
|
-
context "<unknown subcommand>" do
|
56
|
-
it "prints an error" do
|
57
|
-
expect {
|
58
|
-
subject.run(%w[ unknown-subcommand wallet.dat foo bar ])
|
59
|
-
}.to raise_error
|
60
|
-
|
61
|
-
stream_bundle.captured_error.should eq %'Unknown satoshi-wallet subcommand: "unknown-subcommand"\n'
|
62
|
-
end
|
63
|
-
|
64
|
-
it "raises an error" do
|
65
|
-
expect {
|
66
|
-
subject.run(%w[ unknown-subcommand wallet.dat foo bar ])
|
67
|
-
}.to raise_error(CLI::CommandError)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
contract "StreamBundle" do
|
2
|
-
let(:input) { StringIO.new }
|
3
|
-
let(:output) { StringIO.new }
|
4
|
-
let(:error) { StringIO.new }
|
5
|
-
|
6
|
-
let(:subject) { described_class.new(input, output, error) }
|
7
|
-
|
8
|
-
describe "#puts_output" do
|
9
|
-
it "writes a line to the output" do
|
10
|
-
subject.puts_output("foo")
|
11
|
-
subject.puts_output("bar")
|
12
|
-
subject.puts_output("baz")
|
13
|
-
|
14
|
-
output.rewind
|
15
|
-
output.read.should eq "foo\nbar\nbaz\n"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "#puts_error" do
|
20
|
-
it "writes a line to the output" do
|
21
|
-
subject.puts_error("foo")
|
22
|
-
subject.puts_error("bar")
|
23
|
-
subject.puts_error("baz")
|
24
|
-
|
25
|
-
error.rewind
|
26
|
-
error.read.should eq "foo\nbar\nbaz\n"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,74 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'bitcoin/console/capturing_stream_bundle'
|
4
|
-
|
5
|
-
require_relative '_contracts/stream_bundle_contract'
|
6
|
-
|
7
|
-
module Bitcoin
|
8
|
-
module Console
|
9
|
-
describe CapturingStreamBundle do
|
10
|
-
it_satisfies_contract "StreamBundle"
|
11
|
-
|
12
|
-
let(:input) { StringIO.new }
|
13
|
-
let(:output) { StringIO.new }
|
14
|
-
let(:error) { StringIO.new }
|
15
|
-
|
16
|
-
let(:subject) { CapturingStreamBundle.new(input, output, error) }
|
17
|
-
|
18
|
-
describe ".test_bundle" do
|
19
|
-
it "creates a CapturingStreamBundle with three StringIO streams", because: "we only care about captured output" do
|
20
|
-
# Really should be a separate factory object, but not for the sake of one method
|
21
|
-
CapturingStreamBundle.should_receive(:new).with(
|
22
|
-
an_instance_of(StringIO), an_instance_of(StringIO), an_instance_of(StringIO)
|
23
|
-
).and_return(:stream_bundle)
|
24
|
-
CapturingStreamBundle.test_bundle.should eq :stream_bundle
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# The output and error streams are effectively the same with different names,
|
29
|
-
# but the duplication is only textual and I don't see a neat way to remove it yet
|
30
|
-
|
31
|
-
describe "#captured_output" do
|
32
|
-
before(:each) do
|
33
|
-
subject.puts_output("foo")
|
34
|
-
subject.puts_output("bar")
|
35
|
-
subject.puts_output("baz")
|
36
|
-
end
|
37
|
-
|
38
|
-
its(:captured_output) { should eq "foo\nbar\nbaz\n" }
|
39
|
-
|
40
|
-
it "doesn't manipulate the output stream" do
|
41
|
-
output.stub(:rewind).and_raise(RuntimeError.new)
|
42
|
-
expect { subject.captured_output }.to_not raise_error
|
43
|
-
end
|
44
|
-
|
45
|
-
it "accumulates output across reads" do
|
46
|
-
subject.captured_output
|
47
|
-
subject.puts_output("quux")
|
48
|
-
subject.captured_output.should eq "foo\nbar\nbaz\nquux\n"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "#captured_error" do
|
53
|
-
before(:each) do
|
54
|
-
subject.puts_error("foo")
|
55
|
-
subject.puts_error("bar")
|
56
|
-
subject.puts_error("baz")
|
57
|
-
end
|
58
|
-
|
59
|
-
its(:captured_error) { should eq "foo\nbar\nbaz\n" }
|
60
|
-
|
61
|
-
it "doesn't manipulate the error stream" do
|
62
|
-
error.stub(:rewind).and_raise(RuntimeError.new)
|
63
|
-
expect { subject.captured_error }.to_not raise_error
|
64
|
-
end
|
65
|
-
|
66
|
-
it "accumulates output across reads" do
|
67
|
-
subject.captured_error
|
68
|
-
subject.puts_error("quux")
|
69
|
-
subject.captured_error.should eq "foo\nbar\nbaz\nquux\n"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|