165 lines
4.8 KiB
Ruby
165 lines
4.8 KiB
Ruby
# Copyright (c) HashiCorp, Inc.
|
|
# SPDX-License-Identifier: BUSL-1.1
|
|
|
|
require File.expand_path("../../../../base", __FILE__)
|
|
|
|
require Vagrant.source_root.join("plugins/commands/cloud/search")
|
|
|
|
describe VagrantPlugins::CloudCommand::Command::Search do
|
|
include_context "unit"
|
|
|
|
let(:token) { double("token") }
|
|
let(:argv) { [] }
|
|
let(:iso_env) do
|
|
# We have to create a Vagrantfile so there is a root path
|
|
env = isolated_environment
|
|
env.vagrantfile("")
|
|
env.create_vagrant_env
|
|
end
|
|
|
|
subject { described_class.new(argv, iso_env) }
|
|
|
|
describe "#search" do
|
|
let(:query) { double("query") }
|
|
let(:options) { {} }
|
|
let(:account) { double("account", searcher: searcher) }
|
|
let(:searcher) { double("searcher") }
|
|
let(:results) { double("results", boxes: boxes) }
|
|
let(:boxes) { [] }
|
|
|
|
before do
|
|
allow(VagrantCloud::Account).to receive(:new).
|
|
with(custom_server: anything, access_token: token).and_return(account)
|
|
allow(searcher).to receive(:search).and_return(results)
|
|
allow(subject).to receive(:format_search_results)
|
|
end
|
|
|
|
it "should perform search" do
|
|
expect(searcher).to receive(:search).with(hash_including(query: query)).and_return(results)
|
|
subject.search(query, token, options)
|
|
end
|
|
|
|
it "should print a warning when no results are found" do
|
|
expect(iso_env.ui).to receive(:warn)
|
|
subject.search(query, token, options)
|
|
end
|
|
|
|
context "with valid options" do
|
|
let(:architecture) { double("architecture") }
|
|
let(:provider) { double("provider") }
|
|
let(:sort) { double("sort") }
|
|
let(:order) { double("order") }
|
|
let(:limit) { double("limit") }
|
|
let(:page) { double("page") }
|
|
|
|
let(:options) { {
|
|
architecture: architecture,
|
|
provider: provider,
|
|
sort: sort,
|
|
order: order,
|
|
limit: limit,
|
|
page: page
|
|
} }
|
|
|
|
it "should use options when performing search" do
|
|
expect(searcher).to receive(:search) do |**args|
|
|
options.each_pair do |k, v|
|
|
expect(args[k]).to eq(v)
|
|
end
|
|
results
|
|
end
|
|
subject.search(query, token, options)
|
|
end
|
|
|
|
context "with invalid options" do
|
|
before { options[:invalid_option] = "testing" }
|
|
|
|
it "should only pass supported options to search" do
|
|
expect(searcher).to receive(:search) do |**args|
|
|
options.each_pair do |k, v|
|
|
next if k == :invalid_option
|
|
expect(args[k]).to eq(v)
|
|
end
|
|
expect(args.key?(:invalid_option)).to be_falsey
|
|
results
|
|
end
|
|
subject.search(query, token, options)
|
|
end
|
|
end
|
|
end
|
|
|
|
context "with search results" do
|
|
let(:results) { double("results", boxes: [double("result")]) }
|
|
|
|
it "should format the results" do
|
|
expect(subject).to receive(:format_search_results).with(results.boxes, any_args)
|
|
subject.search(query, token, options)
|
|
end
|
|
|
|
context "with format options" do
|
|
let(:options) { {short: true, json: false} }
|
|
|
|
it "should pass options to format" do
|
|
expect(subject).to receive(:format_search_results).with(results.boxes, true, false, iso_env)
|
|
subject.search(query, token, options)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#execute" do
|
|
let(:argv) { [] }
|
|
let(:iso_env) do
|
|
# We have to create a Vagrantfile so there is a root path
|
|
env = isolated_environment
|
|
env.vagrantfile("")
|
|
env.create_vagrant_env
|
|
end
|
|
|
|
subject { described_class.new(argv, iso_env) }
|
|
|
|
let(:action_runner) { double("action_runner") }
|
|
|
|
let(:client) { double("client", token: token) }
|
|
let(:box) { double("box") }
|
|
|
|
before do
|
|
allow(iso_env).to receive(:action_runner).and_return(action_runner)
|
|
allow(subject).to receive(:client_login).and_return(client)
|
|
allow(subject).to receive(:search)
|
|
end
|
|
|
|
context "with no arguments" do
|
|
it "shows help" do
|
|
expect { subject.execute }.
|
|
to raise_error(Vagrant::Errors::CLIInvalidUsage)
|
|
end
|
|
end
|
|
|
|
context "with query argument" do
|
|
let(:query_arg) { "search-query" }
|
|
|
|
before { argv << query_arg }
|
|
|
|
it "should run the search" do
|
|
expect(subject).to receive(:search).with(query_arg, any_args)
|
|
subject.execute
|
|
end
|
|
|
|
it "should setup client login quietly by default" do
|
|
expect(subject).to receive(:client_login).with(iso_env, hash_including(quiet: true))
|
|
subject.execute
|
|
end
|
|
|
|
context "with --auth flag" do
|
|
before { argv << "--auth" }
|
|
|
|
it "should not setup login client quietly" do
|
|
expect(subject).to receive(:client_login).with(iso_env, hash_including(quiet: false))
|
|
subject.execute
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|