From 1029308530c2fab80b92b977b6e1a1a36b00b019 Mon Sep 17 00:00:00 2001
From: Gergely Brautigam <skarlso777@gmail.com>
Date: Sun, 25 Aug 2019 21:57:54 +0200
Subject: [PATCH] Added moar coverage for the worker.

---
 workers/server/worker.go      |  6 ++-
 workers/server/worker_test.go | 71 ++++++++++++++++++++++++++++++++---
 2 files changed, 71 insertions(+), 6 deletions(-)

diff --git a/workers/server/worker.go b/workers/server/worker.go
index ebe92055..3ca180a5 100644
--- a/workers/server/worker.go
+++ b/workers/server/worker.go
@@ -102,7 +102,7 @@ func (w *WorkServer) GetWork(workInst *pb.WorkerInstance, serv pb.Worker_GetWork
 	return nil
 }
 
-// GetGitRepo checks out the code for a git repository.
+// GetGitRepo retrieves repository information associated with a pipline.
 func (w *WorkServer) GetGitRepo(ctx context.Context, in *pb.PipelineID) (*pb.GitRepo, error) {
 	repo := &pb.GitRepo{}
 
@@ -124,6 +124,10 @@ func (w *WorkServer) GetGitRepo(ctx context.Context, in *pb.PipelineID) (*pb.Git
 		return repo, err
 	}
 
+	if repoInfo == nil {
+		return nil, fmt.Errorf("pipeline for id %d not found\n", int(in.Id))
+	}
+
 	pk := pb.PrivateKey{}
 	pk.Key = repoInfo.Repo.PrivateKey.Key
 	pk.Username = repoInfo.Repo.PrivateKey.Username
diff --git a/workers/server/worker_test.go b/workers/server/worker_test.go
index ffc40613..33013f67 100644
--- a/workers/server/worker_test.go
+++ b/workers/server/worker_test.go
@@ -4,6 +4,12 @@ import (
 	"bytes"
 	"context"
 	"fmt"
+	"io"
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"testing"
+
 	"github.com/gaia-pipeline/gaia"
 	"github.com/gaia-pipeline/gaia/services"
 	"github.com/gaia-pipeline/gaia/store"
@@ -14,11 +20,6 @@ import (
 	"github.com/hashicorp/go-hclog"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/metadata"
-	"io"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"testing"
 )
 
 type mockMemDBService struct {
@@ -42,12 +43,16 @@ func (mm *mockMemDBService) DeleteWorker(id string, persist bool) error {
 
 type mockStorageService struct {
 	store.GaiaStore
+	mockPipeline *gaia.Pipeline
 }
 
 func (s *mockStorageService) PipelineGetRunByPipelineIDAndID(pipelineid int, runid int) (*gaia.PipelineRun, error) {
 	return generateTestData(), nil
 }
 func (s *mockStorageService) PipelinePutRun(r *gaia.PipelineRun) error { return nil }
+func (s *mockStorageService) PipelineGet(id int) (pipeline *gaia.Pipeline, err error) {
+	return s.mockPipeline, nil
+}
 
 type mockGetWorkServ struct {
 	grpc.ServerStream
@@ -317,3 +322,59 @@ func TestDeregister(t *testing.T) {
 		t.Fatal(err)
 	}
 }
+
+func TestGetGitRepository(t *testing.T) {
+	gaia.Cfg = &gaia.Config{}
+	gaia.Cfg.Logger = hclog.New(&hclog.LoggerOptions{
+		Level: hclog.Trace,
+		Name:  "Gaia",
+	})
+	ms := mockStorageService{mockPipeline: &gaia.Pipeline{
+		ID:   1,
+		Name: "testPipeline",
+		Repo: &gaia.GitRepo{
+			URL: "https://github.com/gaia-pipeline/go-example",
+		},
+	}}
+	services.MockMemDBService(&mockMemDBService{})
+	services.MockStorageService(&ms)
+
+	// Mock gRPC server
+	mw := mockGetWorkServ{}
+
+	// Run deregister
+	ws := WorkServer{}
+	repo, err := ws.GetGitRepo(mw.Context(), &pb.PipelineID{Id: 1})
+	if err != nil {
+		t.Fatal(err)
+	}
+	expectedRepoURL := "https://github.com/gaia-pipeline/go-example"
+	if repo.Url != expectedRepoURL {
+		t.Fatalf("expected git repo url: %s, got: %s\n", expectedRepoURL, repo.Url)
+	}
+}
+
+func TestGetGitRepositoryRepoNotFound(t *testing.T) {
+	gaia.Cfg = &gaia.Config{}
+	gaia.Cfg.Logger = hclog.New(&hclog.LoggerOptions{
+		Level: hclog.Trace,
+		Name:  "Gaia",
+	})
+	services.MockMemDBService(&mockMemDBService{})
+	services.MockStorageService(&mockStorageService{})
+
+	// Mock gRPC server
+	mw := mockGetWorkServ{}
+
+	// Run deregister
+	ws := WorkServer{}
+	_, err := ws.GetGitRepo(mw.Context(), &pb.PipelineID{Id: 9999})
+	if err == nil {
+		t.Fatal("should have gotten an error because pipeline doesn't exist")
+	}
+
+	expectedError := fmt.Sprintf("pipeline for id %d not found\n", 9999)
+	if err.Error() != expectedError {
+		t.Fatalf("expected error message: %s, got: %s\n", expectedError, err.Error())
+	}
+}