1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
# frozen_string_literal: true
RSpec.describe TTY::Prompt, "#mask" do
let(:symbols) { TTY::Prompt::Symbols.symbols }
subject(:prompt) { TTY::Prompt::Test.new }
it "masks output by default" do
prompt.input << "pass\r"
prompt.input.rewind
answer = prompt.mask("What is your password?")
expect(answer).to eql("pass")
expect(prompt.output.string).to eq([
"What is your password? ",
"\e[2K\e[1G",
"What is your password? #{symbols[:dot]}",
"\e[2K\e[1G",
"What is your password? #{symbols[:dot] * 2}",
"\e[2K\e[1G",
"What is your password? #{symbols[:dot] * 3}",
"\e[2K\e[1G",
"What is your password? #{symbols[:dot] * 4}",
"\e[2K\e[1G",
"What is your password? \e[32m#{symbols[:dot] * 4}\e[0m\n",
"\e[1A\e[2K\e[1G",
"What is your password? \e[32m#{symbols[:dot] * 4}\e[0m\n"
].join)
end
it "masks output with custom character" do
prompt.input << "pass\r"
prompt.input.rewind
answer = prompt.mask("What is your password?") { |q| q.mask("*") }
expect(answer).to eql("pass")
expect(prompt.output.string).to eq([
"What is your password? ",
"\e[2K\e[1G",
"What is your password? *",
"\e[2K\e[1G",
"What is your password? **",
"\e[2K\e[1G",
"What is your password? ***",
"\e[2K\e[1G",
"What is your password? ****",
"\e[2K\e[1G",
"What is your password? \e[32m****\e[0m\n",
"\e[1A\e[2K\e[1G",
"What is your password? \e[32m****\e[0m\n"
].join)
end
it "masks with unicode character" do
prompt.input << "lov\n"
prompt.input.rewind
answer = prompt.mask("What is your password?", mask: "\u2665")
expect(answer).to eql("lov")
expect(prompt.output.string).to eq([
"What is your password? ",
"\e[2K\e[1G",
"What is your password? ♥",
"\e[2K\e[1G",
"What is your password? ♥♥",
"\e[2K\e[1G",
"What is your password? ♥♥♥",
"\e[2K\e[1G",
"What is your password? \e[32m♥♥♥\e[0m\n",
"\e[1A\e[2K\e[1G",
"What is your password? \e[32m♥♥♥\e[0m\n"
].join)
end
it "ignores mask if echo is off" do
prompt.input << "pass\n"
prompt.input.rewind
answer = prompt.mask("What is your password?") do |q|
q.echo false
q.mask "*"
end
expect(answer).to eql("pass")
expect(prompt.output.string).to eq([
"What is your password? ",
"\e[2K\e[1G",
"What is your password? ",
"\e[2K\e[1G",
"What is your password? ",
"\e[2K\e[1G",
"What is your password? ",
"\e[2K\e[1G",
"What is your password? ",
"\e[2K\e[1G",
"What is your password? \n",
"\e[1A\e[2K\e[1G",
"What is your password? \n"
].join)
end
it "validates input" do
prompt = TTY::Prompt::Test.new(symbols: {dot: "*"})
prompt.input << "no\nyes\n"
prompt.input.rewind
answer = prompt.mask("What is your password?") do |q|
q.echo true
q.validate(/[a-z]{3,4}/)
q.messages[:valid?] = "Not valid"
end
expect(answer).to eq("yes")
expect(prompt.output.string).to eq([
"What is your password? ",
"\e[2K\e[1G",
"What is your password? *",
"\e[2K\e[1G",
"What is your password? **",
"\e[2K\e[1G",
"What is your password? \e[32m**\e[0m\n",
"\e[31m>>\e[0m Not valid",
"\e[1A\e[2K\e[1G",
"What is your password? \e[31m**\e[0m",
"\e[2K\e[1G",
"What is your password? *",
"\e[2K\e[1G",
"What is your password? **",
"\e[2K\e[1G",
"What is your password? ***",
"\e[2K\e[1G",
"What is your password? \e[32m***\e[0m\n",
"\e[2K\e[1G",
"\e[1A\e[2K\e[1G",
"What is your password? \e[32m***\e[0m\n"
].join)
end
end
|