137 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
require 'spec_helper'
 | 
						|
 | 
						|
describe Gitlab::Serverless::Service do
 | 
						|
  let(:cluster) { create(:cluster) }
 | 
						|
  let(:environment) { create(:environment) }
 | 
						|
  let(:attributes) do
 | 
						|
    {
 | 
						|
      'apiVersion' => 'serving.knative.dev/v1alpha1',
 | 
						|
      'kind' => 'Service',
 | 
						|
      'metadata' => {
 | 
						|
        'creationTimestamp' => '2019-10-22T21:19:13Z',
 | 
						|
        'name' => 'kubetest',
 | 
						|
        'namespace' => 'project1-1-environment1'
 | 
						|
      },
 | 
						|
      'spec' => {
 | 
						|
        'runLatest' => {
 | 
						|
          'configuration' => {
 | 
						|
            'build' => {
 | 
						|
              'template' => {
 | 
						|
                'name' => 'some-image'
 | 
						|
              }
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      },
 | 
						|
      'environment_scope' => '*',
 | 
						|
      'cluster' => cluster,
 | 
						|
      'environment' => environment,
 | 
						|
      'podcount' => 0
 | 
						|
    }
 | 
						|
  end
 | 
						|
 | 
						|
  it 'exposes methods extracting data from the attributes hash' do
 | 
						|
    service = Gitlab::Serverless::Service.new(attributes)
 | 
						|
 | 
						|
    expect(service.name).to eq('kubetest')
 | 
						|
    expect(service.namespace).to eq('project1-1-environment1')
 | 
						|
    expect(service.environment_scope).to eq('*')
 | 
						|
    expect(service.podcount).to eq(0)
 | 
						|
    expect(service.created_at).to eq(DateTime.parse('2019-10-22T21:19:13Z'))
 | 
						|
    expect(service.image).to eq('some-image')
 | 
						|
    expect(service.cluster).to eq(cluster)
 | 
						|
    expect(service.environment).to eq(environment)
 | 
						|
  end
 | 
						|
 | 
						|
  it 'returns nil for missing attributes' do
 | 
						|
    service = Gitlab::Serverless::Service.new({})
 | 
						|
 | 
						|
    [:name, :namespace, :environment_scope, :cluster, :podcount, :created_at, :image, :description, :url, :environment].each do |method|
 | 
						|
      expect(service.send(method)).to be_nil
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#description' do
 | 
						|
    it 'extracts the description in knative 7 format if available' do
 | 
						|
      attributes = {
 | 
						|
        'spec' => {
 | 
						|
          'template' => {
 | 
						|
            'metadata' => {
 | 
						|
              'annotations' => {
 | 
						|
                'Description' => 'some description'
 | 
						|
              }
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
      service = Gitlab::Serverless::Service.new(attributes)
 | 
						|
 | 
						|
      expect(service.description).to eq('some description')
 | 
						|
    end
 | 
						|
 | 
						|
    it 'extracts the description in knative 5/6 format if 7 is not available' do
 | 
						|
      attributes = {
 | 
						|
        'spec' => {
 | 
						|
          'runLatest' => {
 | 
						|
            'configuration' => {
 | 
						|
              'revisionTemplate' => {
 | 
						|
                'metadata' => {
 | 
						|
                  'annotations' => {
 | 
						|
                    'Description' => 'some description'
 | 
						|
                  }
 | 
						|
                }
 | 
						|
              }
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
      service = Gitlab::Serverless::Service.new(attributes)
 | 
						|
 | 
						|
      expect(service.description).to eq('some description')
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#url' do
 | 
						|
    let(:serverless_domain) { instance_double(::Serverless::Domain, uri: URI('https://proxy.example.com')) }
 | 
						|
 | 
						|
    it 'returns proxy URL if cluster has serverless domain' do
 | 
						|
      # cluster = create(:cluster)
 | 
						|
      knative = create(:clusters_applications_knative, :installed, cluster: cluster)
 | 
						|
      create(:serverless_domain_cluster, clusters_applications_knative_id: knative.id)
 | 
						|
      service = Gitlab::Serverless::Service.new(attributes.merge('cluster' => cluster))
 | 
						|
 | 
						|
      expect(::Serverless::Domain).to receive(:new).with(
 | 
						|
        function_name: service.name,
 | 
						|
        serverless_domain_cluster: service.cluster.serverless_domain,
 | 
						|
        environment: service.environment
 | 
						|
      ).and_return(serverless_domain)
 | 
						|
 | 
						|
      expect(service.url).to eq('https://proxy.example.com')
 | 
						|
    end
 | 
						|
 | 
						|
    it 'returns the URL from the knative 6/7 format' do
 | 
						|
      attributes = {
 | 
						|
        'status' => {
 | 
						|
          'url' => 'https://example.com'
 | 
						|
        }
 | 
						|
      }
 | 
						|
      service = Gitlab::Serverless::Service.new(attributes)
 | 
						|
 | 
						|
      expect(service.url).to eq('https://example.com')
 | 
						|
    end
 | 
						|
 | 
						|
    it 'returns the URL from the knative 5 format' do
 | 
						|
      attributes = {
 | 
						|
        'status' => {
 | 
						|
          'domain' => 'example.com'
 | 
						|
        }
 | 
						|
      }
 | 
						|
      service = Gitlab::Serverless::Service.new(attributes)
 | 
						|
 | 
						|
      expect(service.url).to eq('http://example.com')
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |