require 'spec_helper'

describe Aptible::CLI::Helpers::Vhost do
  subject { Class.new.send(:include, described_class).new }

  describe '#explain_vhost' do
    let(:lines) { [] }
    before { allow(subject).to receive(:say) { |m| lines << m } }

    it 'explains a VHOST' do
      service = Fabricate(:service, process_type: 'web')
      vhost = Fabricate(
        :vhost,
        service: service,
        external_host: 'foo.io',
        status: 'provisioned',
        type: 'http_proxy_protocol',
        internal: false,
        ip_whitelist: [],
        default: false,
        acme: false
      )
      subject.explain_vhost(service, vhost)

      expected = [
        'Service: web',
        'Hostname: foo.io',
        'Status: provisioned',
        'Type: https',
        'Port: default',
        'Internal: false',
        'IP Whitelist: all traffic',
        'Default Domain Enabled: false',
        'Managed TLS Enabled: false'
      ]
      expect(lines).to eq(expected)
    end

    it 'explains a failed VHOST' do
      vhost = Fabricate(:vhost, status: 'provision_failed')
      subject.explain_vhost(vhost.service, vhost)
      expect(lines).to include('Status: provision_failed')
    end

    it 'explains an internal VHOST' do
      vhost = Fabricate(:vhost, internal: true)
      subject.explain_vhost(vhost.service, vhost)
      expect(lines).to include('Internal: true')
    end

    it 'explains a default VHOST' do
      vhost = Fabricate(:vhost, default: true, virtual_domain: 'qux.io')
      subject.explain_vhost(vhost.service, vhost)
      expect(lines).to include('Default Domain Enabled: true')
      expect(lines).to include('Default Domain: qux.io')
    end

    it 'explains a TLS VHOST' do
      vhost = Fabricate(:vhost, type: 'tls')
      subject.explain_vhost(vhost.service, vhost)
      expect(lines).to include('Type: tls')
      expect(lines).to include('Ports: all')
    end

    it 'explains a TCP VHOST' do
      vhost = Fabricate(:vhost, type: 'tcp')
      subject.explain_vhost(vhost.service, vhost)
      expect(lines).to include('Type: tcp')
      expect(lines).to include('Ports: all')
    end

    it 'explains a VHOST with a container port' do
      vhost = Fabricate(:vhost, type: 'http_proxy_protocol', container_port: 12)
      subject.explain_vhost(vhost.service, vhost)
      expect(lines).to include('Port: 12')
    end

    it 'explains a VHOST with container ports' do
      vhost = Fabricate(:vhost, type: 'tls', container_ports: [12, 34])
      subject.explain_vhost(vhost.service, vhost)
      expect(lines).to include('Ports: 12 34')
    end

    it 'explains a VHOST with IP Filtering' do
      vhost = Fabricate(:vhost, ip_whitelist: %w(1.1.1.1/1 2.2.2.2/2))
      subject.explain_vhost(vhost.service, vhost)
      expect(lines).to include('IP Whitelist: 1.1.1.1/1 2.2.2.2/2')
    end

    it 'explains a VHOST with Managed TLS' do
      vhost = Fabricate(
        :vhost,
        acme: true,
        user_domain: 'foo.io',
        acme_dns_challenge_host: 'dns.qux.io',
        acme_status: 'ready'
      )
      subject.explain_vhost(vhost.service, vhost)
      expect(lines).to include('Managed TLS Enabled: true')
      expect(lines).to include('Managed TLS Domain: foo.io')
      expect(lines).to include('Managed TLS DNS Challenge Hostname: dns.qux.io')
      expect(lines).to include('Managed TLS Status: ready')
    end
  end
end