config_test.go

  1package github
  2
  3import (
  4	"os"
  5	"testing"
  6
  7	"github.com/stretchr/testify/assert"
  8
  9	"github.com/MichaelMure/git-bug/bridge/core/auth"
 10)
 11
 12func TestSplitURL(t *testing.T) {
 13	type args struct {
 14		url string
 15	}
 16	type want struct {
 17		owner   string
 18		project string
 19		err     error
 20	}
 21	tests := []struct {
 22		name string
 23		args args
 24		want want
 25	}{
 26		{
 27			name: "default url",
 28			args: args{
 29				url: "https://github.com/MichaelMure/git-bug",
 30			},
 31			want: want{
 32				owner:   "MichaelMure",
 33				project: "git-bug",
 34				err:     nil,
 35			},
 36		},
 37		{
 38			name: "default issues url",
 39			args: args{
 40				url: "https://github.com/MichaelMure/git-bug/issues",
 41			},
 42			want: want{
 43				owner:   "MichaelMure",
 44				project: "git-bug",
 45				err:     nil,
 46			},
 47		},
 48		{
 49			name: "default url with git extension",
 50			args: args{
 51				url: "https://github.com/MichaelMure/git-bug.git",
 52			},
 53			want: want{
 54				owner:   "MichaelMure",
 55				project: "git-bug",
 56				err:     nil,
 57			},
 58		},
 59		{
 60			name: "url with git protocol",
 61			args: args{
 62				url: "git://github.com/MichaelMure/git-bug.git",
 63			},
 64			want: want{
 65				owner:   "MichaelMure",
 66				project: "git-bug",
 67				err:     nil,
 68			},
 69		},
 70		{
 71			name: "ssh url",
 72			args: args{
 73				url: "git@github.com:MichaelMure/git-bug.git",
 74			},
 75			want: want{
 76				owner:   "MichaelMure",
 77				project: "git-bug",
 78				err:     nil,
 79			},
 80		},
 81		{
 82			name: "bad url",
 83			args: args{
 84				url: "https://githb.com/MichaelMure/git-bug.git",
 85			},
 86			want: want{
 87				err: ErrBadProjectURL,
 88			},
 89		},
 90	}
 91
 92	for _, tt := range tests {
 93		t.Run(tt.name, func(t *testing.T) {
 94			owner, project, err := splitURL(tt.args.url)
 95			assert.Equal(t, tt.want.err, err)
 96			assert.Equal(t, tt.want.owner, owner)
 97			assert.Equal(t, tt.want.project, project)
 98		})
 99	}
100}
101
102func TestValidateUsername(t *testing.T) {
103	if env := os.Getenv("TRAVIS"); env == "true" {
104		t.Skip("Travis environment: avoiding non authenticated requests")
105	}
106
107	if _, has := os.LookupEnv("CI"); has {
108		t.Skip("Github action environment: avoiding non authenticated requests")
109	}
110
111	tests := []struct {
112		name  string
113		input string
114		fixed string
115		ok    bool
116	}{
117		{
118			name:  "existing username",
119			input: "MichaelMure",
120			fixed: "MichaelMure",
121			ok:    true,
122		},
123		{
124			name:  "existing username with bad case",
125			input: "MicHaelmurE",
126			fixed: "MichaelMure",
127			ok:    true,
128		},
129		{
130			name:  "existing organisation",
131			input: "ipfs",
132			fixed: "ipfs",
133			ok:    true,
134		},
135		{
136			name:  "existing organisation with bad case",
137			input: "iPfS",
138			fixed: "ipfs",
139			ok:    true,
140		},
141		{
142			name:  "non existing username",
143			input: "cant-find-this",
144			fixed: "",
145			ok:    false,
146		},
147	}
148
149	for _, tt := range tests {
150		t.Run(tt.name, func(t *testing.T) {
151			ok, fixed, err := validateUsername(tt.input)
152			assert.NoError(t, err)
153			assert.Equal(t, tt.ok, ok)
154			assert.Equal(t, tt.fixed, fixed)
155		})
156	}
157}
158
159func TestValidateProject(t *testing.T) {
160	envPrivate := os.Getenv("GITHUB_TOKEN_PRIVATE")
161	if envPrivate == "" {
162		t.Skip("Env var GITHUB_TOKEN_PRIVATE missing")
163	}
164
165	envPublic := os.Getenv("GITHUB_TOKEN_PUBLIC")
166	if envPublic == "" {
167		t.Skip("Env var GITHUB_TOKEN_PUBLIC missing")
168	}
169
170	tokenPrivate := auth.NewToken(target, envPrivate)
171	tokenPublic := auth.NewToken(target, envPublic)
172
173	type args struct {
174		owner   string
175		project string
176		token   *auth.Token
177	}
178	tests := []struct {
179		name string
180		args args
181		want bool
182	}{
183		{
184			name: "public repository and token with scope 'public_repo'",
185			args: args{
186				project: "git-bug",
187				owner:   "MichaelMure",
188				token:   tokenPublic,
189			},
190			want: true,
191		},
192		{
193			name: "private repository and token with scope 'repo'",
194			args: args{
195				project: "git-bug-test-github-bridge",
196				owner:   "MichaelMure",
197				token:   tokenPrivate,
198			},
199			want: true,
200		},
201		{
202			name: "private repository and token with scope 'public_repo'",
203			args: args{
204				project: "git-bug-test-github-bridge",
205				owner:   "MichaelMure",
206				token:   tokenPublic,
207			},
208			want: false,
209		},
210		{
211			name: "project not existing",
212			args: args{
213				project: "cant-find-this",
214				owner:   "organisation-not-found",
215				token:   tokenPublic,
216			},
217			want: false,
218		},
219	}
220
221	for _, tt := range tests {
222		t.Run(tt.name, func(t *testing.T) {
223			ok, _ := validateProject(tt.args.owner, tt.args.project, tt.args.token)
224			assert.Equal(t, tt.want, ok)
225		})
226	}
227}