spec/shell/basic_spec.rb in thor-0.18.1 vs spec/shell/basic_spec.rb in thor-0.19.0
- old
+ new
@@ -1,7 +1,7 @@
-# coding: UTF-8
-require 'helper'
+# coding: utf-8
+require "helper"
describe Thor::Shell::Basic do
def shell
@shell ||= Thor::Shell::Basic.new
end
@@ -16,127 +16,158 @@
end
end
describe "#ask" do
it "prints a message to the user and gets the response" do
- $stdout.should_receive(:print).with("Should I overwrite it? ")
- $stdin.should_receive(:gets).and_return('Sure')
+ expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", {}).and_return("Sure")
expect(shell.ask("Should I overwrite it?")).to eq("Sure")
end
- it "prints a message and returns nil if EOF is sent to stdin" do
- $stdout.should_receive(:print).with(" ")
- $stdin.should_receive(:gets).and_return(nil)
+ it "prints a message to the user prefixed with the current padding" do
+ expect(Thor::LineEditor).to receive(:readline).with(" Enter your name: ", {}).and_return("George")
+ shell.padding = 2
+ shell.ask("Enter your name:")
+ end
+
+ it "prints a message and returns nil if EOF is given as input" do
+ expect(Thor::LineEditor).to receive(:readline).with(" ", {}).and_return(nil)
expect(shell.ask("")).to eq(nil)
end
+ it "prints a message to the user and does not echo stdin if the echo option is set to false" do
+ expect($stdout).to receive(:print).with('What\'s your password? ')
+ expect($stdin).to receive(:noecho).and_return("mysecretpass")
+ expect(shell.ask("What's your password?", :echo => false)).to eq("mysecretpass")
+ end
it "prints a message to the user with the available options and determines the correctness of the answer" do
- $stdout.should_receive(:print).with('What\'s your favorite Neopolitan flavor? ["strawberry", "chocolate", "vanilla"] ')
- $stdin.should_receive(:gets).and_return('chocolate')
- expect(shell.ask("What's your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])).to eq("chocolate")
+ flavors = %w[strawberry chocolate vanilla]
+ expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', :limited_to => flavors).and_return("chocolate")
+ expect(shell.ask('What\'s your favorite Neopolitan flavor?', :limited_to => flavors)).to eq("chocolate")
end
it "prints a message to the user with the available options and reasks the question after an incorrect repsonse" do
- $stdout.should_receive(:print).with('What\'s your favorite Neopolitan flavor? ["strawberry", "chocolate", "vanilla"] ').twice
- $stdout.should_receive(:puts).with('Your response must be one of: ["strawberry", "chocolate", "vanilla"]. Please try again.')
- $stdin.should_receive(:gets).and_return('moose tracks', 'chocolate')
- expect(shell.ask("What's your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])).to eq("chocolate")
+ flavors = %w[strawberry chocolate vanilla]
+ expect($stdout).to receive(:print).with("Your response must be one of: [strawberry, chocolate, vanilla]. Please try again.\n")
+ expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] ', :limited_to => flavors).and_return("moose tracks", "chocolate")
+ expect(shell.ask('What\'s your favorite Neopolitan flavor?', :limited_to => flavors)).to eq("chocolate")
end
+
+ it "prints a message to the user containing a default and sets the default if only enter is pressed" do
+ expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? (vanilla) ', :default => "vanilla").and_return("")
+ expect(shell.ask('What\'s your favorite Neopolitan flavor?', :default => "vanilla")).to eq("vanilla")
+ end
+
+ it "prints a message to the user with the available options and reasks the question after an incorrect repsonse and then returns the default" do
+ flavors = %w[strawberry chocolate vanilla]
+ expect($stdout).to receive(:print).with("Your response must be one of: [strawberry, chocolate, vanilla]. Please try again.\n")
+ expect(Thor::LineEditor).to receive(:readline).with('What\'s your favorite Neopolitan flavor? [strawberry, chocolate, vanilla] (vanilla) ', :default => "vanilla", :limited_to => flavors).and_return("moose tracks", "")
+ expect(shell.ask("What's your favorite Neopolitan flavor?", :default => "vanilla", :limited_to => flavors)).to eq("vanilla")
+ end
end
describe "#yes?" do
it "asks the user and returns true if the user replies yes" do
- $stdout.should_receive(:print).with("Should I overwrite it? ")
- $stdin.should_receive(:gets).and_return('y')
+ expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("y")
expect(shell.yes?("Should I overwrite it?")).to be_true
+ end
- $stdout.should_receive(:print).with("Should I overwrite it? ")
- $stdin.should_receive(:gets).and_return('n')
+ it "asks the user and returns false if the user replies no" do
+ expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("n")
expect(shell.yes?("Should I overwrite it?")).not_to be_true
end
+
+ it "asks the user and returns false if the user replies with an answer other than yes or no" do
+ expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("foobar")
+ expect(shell.yes?("Should I overwrite it?")).to be_false
+ end
end
describe "#no?" do
it "asks the user and returns true if the user replies no" do
- $stdout.should_receive(:print).with("Should I overwrite it? ")
- $stdin.should_receive(:gets).and_return('n')
+ expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("n")
expect(shell.no?("Should I overwrite it?")).to be_true
+ end
- $stdout.should_receive(:print).with("Should I overwrite it? ")
- $stdin.should_receive(:gets).and_return('Yes')
+ it "asks the user and returns false if the user replies yes" do
+ expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("Yes")
expect(shell.no?("Should I overwrite it?")).to be_false
end
+
+ it "asks the user and returns false if the user replies with an answer other than yes or no" do
+ expect(Thor::LineEditor).to receive(:readline).with("Should I overwrite it? ", :add_to_history => false).and_return("foobar")
+ expect(shell.no?("Should I overwrite it?")).to be_false
+ end
end
describe "#say" do
it "prints a message to the user" do
- $stdout.should_receive(:puts).with("Running...")
+ expect($stdout).to receive(:print).with("Running...\n")
shell.say("Running...")
end
it "prints a message to the user without new line if it ends with a whitespace" do
- $stdout.should_receive(:print).with("Running... ")
+ expect($stdout).to receive(:print).with("Running... ")
shell.say("Running... ")
end
it "does not use a new line with whitespace+newline embedded" do
- $stdout.should_receive(:puts).with("It's \nRunning...")
+ expect($stdout).to receive(:print).with("It's \nRunning...\n")
shell.say("It's \nRunning...")
end
it "prints a message to the user without new line" do
- $stdout.should_receive(:print).with("Running...")
+ expect($stdout).to receive(:print).with("Running...")
shell.say("Running...", nil, false)
end
end
describe "#say_status" do
it "prints a message to the user with status" do
- $stdout.should_receive(:puts).with(" create ~/.thor/command.thor")
+ expect($stdout).to receive(:print).with(" create ~/.thor/command.thor\n")
shell.say_status(:create, "~/.thor/command.thor")
end
- it "always use new line" do
- $stdout.should_receive(:puts).with(" create ")
+ it "always uses new line" do
+ expect($stdout).to receive(:print).with(" create \n")
shell.say_status(:create, "")
end
it "does not print a message if base is muted" do
- shell.should_receive(:mute?).and_return(true)
- $stdout.should_not_receive(:puts)
+ expect(shell).to receive(:mute?).and_return(true)
+ expect($stdout).not_to receive(:print)
shell.mute do
shell.say_status(:created, "~/.thor/command.thor")
end
end
it "does not print a message if base is set to quiet" do
- base = MyCounter.new [1,2]
- base.should_receive(:options).and_return(:quiet => true)
+ base = MyCounter.new [1, 2]
+ expect(base).to receive(:options).and_return(:quiet => true)
- $stdout.should_not_receive(:puts)
+ expect($stdout).not_to receive(:print)
shell.base = base
shell.say_status(:created, "~/.thor/command.thor")
end
it "does not print a message if log status is set to false" do
- $stdout.should_not_receive(:puts)
+ expect($stdout).not_to receive(:print)
shell.say_status(:created, "~/.thor/command.thor", false)
end
- it "uses padding to set messages left margin" do
+ it "uses padding to set message's left margin" do
shell.padding = 2
- $stdout.should_receive(:puts).with(" create ~/.thor/command.thor")
+ expect($stdout).to receive(:print).with(" create ~/.thor/command.thor\n")
shell.say_status(:create, "~/.thor/command.thor")
end
end
describe "#print_in_columns" do
before do
- @array = [1234567890]
- @array += ('a'..'e').to_a
+ @array = [1_234_567_890]
+ @array += ("a".."e").to_a
end
it "prints in columns" do
content = capture(:stdout) { shell.print_in_columns(@array) }
expect(content.rstrip).to eq("1234567890 a b c d e")
@@ -170,11 +201,11 @@
end
it "uses maximum terminal width" do
@table << ["def", "#456", "Lançam foo bar"]
@table << ["ghi", "#789", "بالله عليكم"]
- shell.should_receive(:terminal_width).and_return(20)
+ expect(shell).to receive(:terminal_width).and_return(20)
content = capture(:stdout) { shell.print_table(@table, :indent => 2, :truncate => true) }
expect(content).to eq(<<-TABLE)
abc #123 firs...
#0 empty
xyz #786 last...
@@ -182,11 +213,11 @@
ghi #789 بالل...
TABLE
end
it "honors the colwidth option" do
- content = capture(:stdout) { shell.print_table(@table, :colwidth => 10)}
+ content = capture(:stdout) { shell.print_table(@table, :colwidth => 10) }
expect(content).to eq(<<-TABLE)
abc #123 first three
#0 empty
xyz #786 last three
TABLE
@@ -202,11 +233,11 @@
TABLE
end
it "prints a table with small numbers and right-aligns them" do
table = [
- ["Name", "Number", "Color"],
+ ["Name", "Number", "Color"], # rubocop: disable WordArray
["Erik", 1, "green"]
]
content = capture(:stdout) { shell.print_table(table) }
expect(content).to eq(<<-TABLE)
Name Number Color
@@ -214,11 +245,11 @@
TABLE
end
it "doesn't output extra spaces for right-aligned columns in the last column" do
table = [
- ["Name", "Number"],
+ ["Name", "Number"], # rubocop: disable WordArray
["Erik", 1]
]
content = capture(:stdout) { shell.print_table(table) }
expect(content).to eq(<<-TABLE)
Name Number
@@ -226,12 +257,12 @@
TABLE
end
it "prints a table with big numbers" do
table = [
- ["Name", "Number", "Color"],
- ["Erik", 1234567890123, "green"]
+ ["Name", "Number", "Color"], # rubocop: disable WordArray
+ ["Erik", 1_234_567_890_123, "green"]
]
content = capture(:stdout) { shell.print_table(table) }
expect(content).to eq(<<-TABLE)
Name Number Color
Erik 1234567890123 green
@@ -239,73 +270,63 @@
end
end
describe "#file_collision" do
it "shows a menu with options" do
- $stdout.should_receive(:print).with('Overwrite foo? (enter "h" for help) [Ynaqh] ')
- $stdin.should_receive(:gets).and_return('n')
- shell.file_collision('foo')
+ expect(Thor::LineEditor).to receive(:readline).with('Overwrite foo? (enter "h" for help) [Ynaqh] ', :add_to_history => false).and_return("n")
+ shell.file_collision("foo")
end
- it "returns true if the user choose default option" do
- $stdout.stub!(:print)
- $stdin.should_receive(:gets).and_return('')
- expect(shell.file_collision('foo')).to be_true
+ it "returns true if the user chooses default option" do
+ expect(Thor::LineEditor).to receive(:readline).and_return("")
+ expect(shell.file_collision("foo")).to be_true
end
- it "returns false if the user choose no" do
- $stdout.stub!(:print)
- $stdin.should_receive(:gets).and_return('n')
- expect(shell.file_collision('foo')).to be_false
+ it "returns false if the user chooses no" do
+ expect(Thor::LineEditor).to receive(:readline).and_return("n")
+ expect(shell.file_collision("foo")).to be_false
end
- it "returns true if the user choose yes" do
- $stdout.stub!(:print)
- $stdin.should_receive(:gets).and_return('y')
- expect(shell.file_collision('foo')).to be_true
+ it "returns true if the user chooses yes" do
+ expect(Thor::LineEditor).to receive(:readline).and_return("y")
+ expect(shell.file_collision("foo")).to be_true
end
- it "shows help usage if the user choose help" do
- $stdout.stub!(:print)
- $stdin.should_receive(:gets).and_return('h')
- $stdin.should_receive(:gets).and_return('n')
- help = capture(:stdout) { shell.file_collision('foo') }
+ it "shows help usage if the user chooses help" do
+ expect(Thor::LineEditor).to receive(:readline).and_return("h", "n")
+ help = capture(:stdout) { shell.file_collision("foo") }
expect(help).to match(/h \- help, show this help/)
end
- it "quits if the user choose quit" do
- $stdout.stub!(:print)
- $stdout.should_receive(:puts).with('Aborting...')
- $stdin.should_receive(:gets).and_return('q')
+ it "quits if the user chooses quit" do
+ expect($stdout).to receive(:print).with("Aborting...\n")
+ expect(Thor::LineEditor).to receive(:readline).and_return("q")
- expect {
- shell.file_collision('foo')
- }.to raise_error(SystemExit)
+ expect do
+ shell.file_collision("foo")
+ end.to raise_error(SystemExit)
end
- it "always returns true if the user choose always" do
- $stdout.should_receive(:print).with('Overwrite foo? (enter "h" for help) [Ynaqh] ')
- $stdin.should_receive(:gets).and_return('a')
+ it "always returns true if the user chooses always" do
+ expect(Thor::LineEditor).to receive(:readline).with('Overwrite foo? (enter "h" for help) [Ynaqh] ', :add_to_history => false).and_return("a")
- expect(shell.file_collision('foo')).to be_true
+ expect(shell.file_collision("foo")).to be true
- $stdout.should_not_receive(:print)
- expect(shell.file_collision('foo')).to be_true
+ expect($stdout).not_to receive(:print)
+ expect(shell.file_collision("foo")).to be true
end
describe "when a block is given" do
it "displays diff options to the user" do
- $stdout.should_receive(:print).with('Overwrite foo? (enter "h" for help) [Ynaqdh] ')
- $stdin.should_receive(:gets).and_return('s')
- shell.file_collision('foo'){ }
+ expect(Thor::LineEditor).to receive(:readline).with('Overwrite foo? (enter "h" for help) [Ynaqdh] ', :add_to_history => false).and_return("s")
+ shell.file_collision("foo") {}
end
it "invokes the diff command" do
- $stdout.stub!(:print)
- $stdin.should_receive(:gets).and_return('d')
- $stdin.should_receive(:gets).and_return('n')
- shell.should_receive(:system).with(/diff -u/)
- capture(:stdout) { shell.file_collision('foo'){ } }
+ expect(Thor::LineEditor).to receive(:readline).and_return("d")
+ expect(Thor::LineEditor).to receive(:readline).and_return("n")
+ expect(shell).to receive(:system).with(/diff -u/)
+ capture(:stdout) { shell.file_collision("foo") {} }
end
end
end
end