github.com/rainforestapp/rainforest-cli@v2.12.0+incompatible/gittrigger_test.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"os"
     6  	"os/exec"
     7  	"reflect"
     8  	"strings"
     9  	"testing"
    10  )
    11  
    12  const fakeRepoName = "git_testing_directory"
    13  
    14  var testingDirectory string
    15  
    16  func deleteFakeRepo(t *testing.T) {
    17  	os.Chdir(testingDirectory)
    18  	err := os.RemoveAll(fakeRepoName)
    19  	if err != nil {
    20  		t.Fatalf("Couldn't delete testing directory: %v.", fakeRepoName)
    21  	}
    22  }
    23  
    24  func makeFakeRepoWithCommit(t *testing.T, commitMsg string) {
    25  	// create empty directory for repo
    26  	testingDirectory, _ = os.Getwd()
    27  	err := os.Mkdir(fakeRepoName, 0777)
    28  	if err != nil {
    29  		t.Fatal("Couldn't create directory for testing needs.")
    30  	}
    31  	os.Chdir(fakeRepoName)
    32  	if err != nil {
    33  		deleteFakeRepo(t)
    34  		t.Fatal("Couldn't navigate to the directory for testing needs.")
    35  	}
    36  
    37  	// initialize repo
    38  	cmd := exec.Command("git", "init")
    39  	var out bytes.Buffer
    40  	cmd.Stdout = &out
    41  	err = cmd.Run()
    42  	if err != nil || !strings.Contains(out.String(), "Initialized") {
    43  		deleteFakeRepo(t)
    44  		t.Fatal("Couldn't initialize git repo for testing needs.")
    45  	}
    46  
    47  	// set username and email in local repo
    48  	cmd = exec.Command("git", "config", "user.name", "'Rainforest QA'")
    49  	out.Reset()
    50  	cmd.Stdout = &out
    51  	err = cmd.Run()
    52  	if err != nil {
    53  		deleteFakeRepo(t)
    54  		t.Fatal("Couldn't set the username in repo.")
    55  	}
    56  	cmd = exec.Command("git", "config", "user.email", "'test@rainforestqa.com'")
    57  	out.Reset()
    58  	cmd.Stdout = &out
    59  	err = cmd.Run()
    60  	if err != nil {
    61  		deleteFakeRepo(t)
    62  		t.Fatal("Couldn't set the email in repo.")
    63  	}
    64  	cmd = exec.Command("git", "config", "commit.gpgSign", "false")
    65  	out.Reset()
    66  	cmd.Stdout = &out
    67  	err = cmd.Run()
    68  	if err != nil {
    69  		deleteFakeRepo(t)
    70  		t.Fatal("Couldn't set the email in repo.")
    71  	}
    72  
    73  	// create empty commit
    74  	cmd = exec.Command("git", "commit", "--allow-empty", "-m", commitMsg)
    75  	out.Reset()
    76  	cmd.Stdout = &out
    77  	err = cmd.Run()
    78  	if err != nil || !strings.Contains(out.String(), commitMsg) {
    79  		deleteFakeRepo(t)
    80  		t.Fatal("Couldn't commit to the test repo.")
    81  	}
    82  }
    83  
    84  func TestNewGitTrigger(t *testing.T) {
    85  	const commitMsg = "foo barred baz"
    86  	makeFakeRepoWithCommit(t, commitMsg)
    87  	defer deleteFakeRepo(t)
    88  	git, err := newGitTrigger()
    89  	if err != nil {
    90  		t.Error("Unexpected error when doing newGitTrigger()")
    91  	}
    92  	if git.LastCommit != commitMsg {
    93  		t.Errorf("inproperly initialized gitTrigger with newGitTrigger: %v, expected: %v", git.LastCommit, commitMsg)
    94  	}
    95  }
    96  
    97  func TestGetLatestCommit(t *testing.T) {
    98  	const commitMsg = "test commit in a test repo"
    99  	fakeGit := gitTrigger{Trigger: "@rainforest"}
   100  	makeFakeRepoWithCommit(t, commitMsg)
   101  	defer deleteFakeRepo(t)
   102  	err := fakeGit.getLatestCommit()
   103  	if err != nil {
   104  		t.Error("Unexpected error when doing getLatestCommit()")
   105  	}
   106  	if fakeGit.LastCommit != commitMsg {
   107  		t.Errorf("got wrong commit from GetLatestCommit got: %v, expected: %v", fakeGit.LastCommit, commitMsg)
   108  	}
   109  }
   110  
   111  func TestCheckTrigger(t *testing.T) {
   112  	fakeGit := gitTrigger{Trigger: "@rainforest"}
   113  	var testCases = []struct {
   114  		fakeCommit string
   115  		want       bool
   116  	}{
   117  		{
   118  			fakeCommit: "Testing testing",
   119  			want:       false,
   120  		},
   121  		{
   122  			fakeCommit: "Testing @rainforest testing",
   123  			want:       true,
   124  		},
   125  		{
   126  			fakeCommit: "@rainfnf",
   127  			want:       false,
   128  		},
   129  	}
   130  
   131  	for _, tCase := range testCases {
   132  		fakeGit.LastCommit = tCase.fakeCommit
   133  		got := fakeGit.checkTrigger()
   134  		if !reflect.DeepEqual(tCase.want, got) {
   135  			t.Errorf("checkTrigger returned %+v, want %+v", got, tCase.want)
   136  		}
   137  	}
   138  }
   139  
   140  func TestGetTags(t *testing.T) {
   141  	fakeGit := gitTrigger{Trigger: "@rainforest"}
   142  	var testCases = []struct {
   143  		fakeCommit string
   144  		want       []string
   145  	}{
   146  		{
   147  			fakeCommit: "Testing testing",
   148  			want:       []string{},
   149  		},
   150  		{
   151  			fakeCommit: "@rainforest #foo, #bar",
   152  			want:       []string{"foo", "bar"},
   153  		},
   154  		{
   155  			fakeCommit: "@rainforest #foo #bar-baz #qwe_asd",
   156  			want:       []string{"foo", "bar-baz", "qwe_asd"},
   157  		},
   158  	}
   159  
   160  	for _, tCase := range testCases {
   161  		fakeGit.LastCommit = tCase.fakeCommit
   162  		got := fakeGit.getTags()
   163  		if !reflect.DeepEqual(tCase.want, got) {
   164  			t.Errorf("getTags returned %+v, want %+v", got, tCase.want)
   165  		}
   166  	}
   167  }