1// Copyright 2019 The Gitea Authors. All rights reserved.
2// Copyright 2018 Jonas Franz. All rights reserved.
3// Use of this source code is governed by a MIT-style
4// license that can be found in the LICENSE file.
5
6package migrations
7
8import (
9	"path/filepath"
10	"testing"
11	"time"
12
13	"code.gitea.io/gitea/models/unittest"
14	base "code.gitea.io/gitea/modules/migration"
15
16	"github.com/stretchr/testify/assert"
17)
18
19func TestMain(m *testing.M) {
20	unittest.MainTest(m, filepath.Join("..", ".."))
21}
22
23func timePtr(t time.Time) *time.Time {
24	return &t
25}
26
27func assertTimeEqual(t *testing.T, expected, actual time.Time) {
28	assert.Equal(t, expected.UTC(), actual.UTC())
29}
30
31func assertTimePtrEqual(t *testing.T, expected, actual *time.Time) {
32	if expected == nil {
33		assert.Nil(t, actual)
34	} else {
35		assert.NotNil(t, actual)
36		assertTimeEqual(t, *expected, *actual)
37	}
38}
39
40func assertCommentEqual(t *testing.T, expected, actual *base.Comment) {
41	assert.Equal(t, expected.IssueIndex, actual.IssueIndex)
42	assert.Equal(t, expected.PosterID, actual.PosterID)
43	assert.Equal(t, expected.PosterName, actual.PosterName)
44	assert.Equal(t, expected.PosterEmail, actual.PosterEmail)
45	assertTimeEqual(t, expected.Created, actual.Created)
46	assertTimeEqual(t, expected.Updated, actual.Updated)
47	assert.Equal(t, expected.Content, actual.Content)
48	assertReactionsEqual(t, expected.Reactions, actual.Reactions)
49}
50
51func assertCommentsEqual(t *testing.T, expected, actual []*base.Comment) {
52	if assert.Len(t, actual, len(expected)) {
53		for i := range expected {
54			assertCommentEqual(t, expected[i], actual[i])
55		}
56	}
57}
58
59func assertLabelEqual(t *testing.T, expected, actual *base.Label) {
60	assert.Equal(t, expected.Name, actual.Name)
61	assert.Equal(t, expected.Color, actual.Color)
62	assert.Equal(t, expected.Description, actual.Description)
63}
64
65func assertLabelsEqual(t *testing.T, expected, actual []*base.Label) {
66	if assert.Len(t, actual, len(expected)) {
67		for i := range expected {
68			assertLabelEqual(t, expected[i], actual[i])
69		}
70	}
71}
72
73func assertMilestoneEqual(t *testing.T, expected, actual *base.Milestone) {
74	assert.Equal(t, expected.Title, actual.Title)
75	assert.Equal(t, expected.Description, actual.Description)
76	assertTimePtrEqual(t, expected.Deadline, actual.Deadline)
77	assertTimeEqual(t, expected.Created, actual.Created)
78	assertTimePtrEqual(t, expected.Updated, actual.Updated)
79	assertTimePtrEqual(t, expected.Closed, actual.Closed)
80	assert.Equal(t, expected.State, actual.State)
81}
82
83func assertMilestonesEqual(t *testing.T, expected, actual []*base.Milestone) {
84	if assert.Len(t, actual, len(expected)) {
85		for i := range expected {
86			assertMilestoneEqual(t, expected[i], actual[i])
87		}
88	}
89}
90
91func assertIssueEqual(t *testing.T, expected, actual *base.Issue) {
92	assert.Equal(t, expected.Number, actual.Number)
93	assert.Equal(t, expected.PosterID, actual.PosterID)
94	assert.Equal(t, expected.PosterName, actual.PosterName)
95	assert.Equal(t, expected.PosterEmail, actual.PosterEmail)
96	assert.Equal(t, expected.Title, actual.Title)
97	assert.Equal(t, expected.Content, actual.Content)
98	assert.Equal(t, expected.Ref, actual.Ref)
99	assert.Equal(t, expected.Milestone, actual.Milestone)
100	assert.Equal(t, expected.State, actual.State)
101	assert.Equal(t, expected.IsLocked, actual.IsLocked)
102	assertTimeEqual(t, expected.Created, actual.Created)
103	assertTimeEqual(t, expected.Updated, actual.Updated)
104	assertTimePtrEqual(t, expected.Closed, actual.Closed)
105	assertLabelsEqual(t, expected.Labels, actual.Labels)
106	assertReactionsEqual(t, expected.Reactions, actual.Reactions)
107	assert.ElementsMatch(t, expected.Assignees, actual.Assignees)
108}
109
110func assertIssuesEqual(t *testing.T, expected, actual []*base.Issue) {
111	if assert.Len(t, actual, len(expected)) {
112		for i := range expected {
113			assertIssueEqual(t, expected[i], actual[i])
114		}
115	}
116}
117
118func assertPullRequestEqual(t *testing.T, expected, actual *base.PullRequest) {
119	assert.Equal(t, expected.Number, actual.Number)
120	assert.Equal(t, expected.Title, actual.Title)
121	assert.Equal(t, expected.PosterID, actual.PosterID)
122	assert.Equal(t, expected.PosterName, actual.PosterName)
123	assert.Equal(t, expected.PosterEmail, actual.PosterEmail)
124	assert.Equal(t, expected.Content, actual.Content)
125	assert.Equal(t, expected.Milestone, actual.Milestone)
126	assert.Equal(t, expected.State, actual.State)
127	assertTimeEqual(t, expected.Created, actual.Created)
128	assertTimeEqual(t, expected.Updated, actual.Updated)
129	assertTimePtrEqual(t, expected.Closed, actual.Closed)
130	assertLabelsEqual(t, expected.Labels, actual.Labels)
131	assert.Equal(t, expected.PatchURL, actual.PatchURL)
132	assert.Equal(t, expected.Merged, actual.Merged)
133	assertTimePtrEqual(t, expected.MergedTime, actual.MergedTime)
134	assert.Equal(t, expected.MergeCommitSHA, actual.MergeCommitSHA)
135	assertPullRequestBranchEqual(t, expected.Head, actual.Head)
136	assertPullRequestBranchEqual(t, expected.Base, actual.Base)
137	assert.ElementsMatch(t, expected.Assignees, actual.Assignees)
138	assert.Equal(t, expected.IsLocked, actual.IsLocked)
139	assertReactionsEqual(t, expected.Reactions, actual.Reactions)
140}
141
142func assertPullRequestsEqual(t *testing.T, expected, actual []*base.PullRequest) {
143	if assert.Len(t, actual, len(expected)) {
144		for i := range expected {
145			assertPullRequestEqual(t, expected[i], actual[i])
146		}
147	}
148}
149
150func assertPullRequestBranchEqual(t *testing.T, expected, actual base.PullRequestBranch) {
151	assert.Equal(t, expected.CloneURL, actual.CloneURL)
152	assert.Equal(t, expected.Ref, actual.Ref)
153	assert.Equal(t, expected.SHA, actual.SHA)
154	assert.Equal(t, expected.RepoName, actual.RepoName)
155	assert.Equal(t, expected.OwnerName, actual.OwnerName)
156}
157
158func assertReactionEqual(t *testing.T, expected, actual *base.Reaction) {
159	assert.Equal(t, expected.UserID, actual.UserID)
160	assert.Equal(t, expected.UserName, actual.UserName)
161	assert.Equal(t, expected.Content, actual.Content)
162}
163
164func assertReactionsEqual(t *testing.T, expected, actual []*base.Reaction) {
165	if assert.Len(t, actual, len(expected)) {
166		for i := range expected {
167			assertReactionEqual(t, expected[i], actual[i])
168		}
169	}
170}
171
172func assertReleaseAssetEqual(t *testing.T, expected, actual *base.ReleaseAsset) {
173	assert.Equal(t, expected.ID, actual.ID)
174	assert.Equal(t, expected.Name, actual.Name)
175	assert.Equal(t, expected.ContentType, actual.ContentType)
176	assert.Equal(t, expected.Size, actual.Size)
177	assert.Equal(t, expected.DownloadCount, actual.DownloadCount)
178	assertTimeEqual(t, expected.Created, actual.Created)
179	assertTimeEqual(t, expected.Updated, actual.Updated)
180	assert.Equal(t, expected.DownloadURL, actual.DownloadURL)
181}
182
183func assertReleaseAssetsEqual(t *testing.T, expected, actual []*base.ReleaseAsset) {
184	if assert.Len(t, actual, len(expected)) {
185		for i := range expected {
186			assertReleaseAssetEqual(t, expected[i], actual[i])
187		}
188	}
189}
190
191func assertReleaseEqual(t *testing.T, expected, actual *base.Release) {
192	assert.Equal(t, expected.TagName, actual.TagName)
193	assert.Equal(t, expected.TargetCommitish, actual.TargetCommitish)
194	assert.Equal(t, expected.Name, actual.Name)
195	assert.Equal(t, expected.Body, actual.Body)
196	assert.Equal(t, expected.Draft, actual.Draft)
197	assert.Equal(t, expected.Prerelease, actual.Prerelease)
198	assert.Equal(t, expected.PublisherID, actual.PublisherID)
199	assert.Equal(t, expected.PublisherName, actual.PublisherName)
200	assert.Equal(t, expected.PublisherEmail, actual.PublisherEmail)
201	assertReleaseAssetsEqual(t, expected.Assets, actual.Assets)
202	assertTimeEqual(t, expected.Created, actual.Created)
203	assertTimeEqual(t, expected.Published, actual.Published)
204}
205
206func assertReleasesEqual(t *testing.T, expected, actual []*base.Release) {
207	if assert.Len(t, actual, len(expected)) {
208		for i := range expected {
209			assertReleaseEqual(t, expected[i], actual[i])
210		}
211	}
212}
213
214func assertRepositoryEqual(t *testing.T, expected, actual *base.Repository) {
215	assert.Equal(t, expected.Name, actual.Name)
216	assert.Equal(t, expected.Owner, actual.Owner)
217	assert.Equal(t, expected.IsPrivate, actual.IsPrivate)
218	assert.Equal(t, expected.IsMirror, actual.IsMirror)
219	assert.Equal(t, expected.Description, actual.Description)
220	assert.Equal(t, expected.CloneURL, actual.CloneURL)
221	assert.Equal(t, expected.OriginalURL, actual.OriginalURL)
222	assert.Equal(t, expected.DefaultBranch, actual.DefaultBranch)
223}
224
225func assertReviewEqual(t *testing.T, expected, actual *base.Review) {
226	assert.Equal(t, expected.ID, actual.ID, "ID")
227	assert.Equal(t, expected.IssueIndex, actual.IssueIndex, "IsssueIndex")
228	assert.Equal(t, expected.ReviewerID, actual.ReviewerID, "ReviewerID")
229	assert.Equal(t, expected.ReviewerName, actual.ReviewerName, "ReviewerName")
230	assert.Equal(t, expected.Official, actual.Official, "Official")
231	assert.Equal(t, expected.CommitID, actual.CommitID, "CommitID")
232	assert.Equal(t, expected.Content, actual.Content, "Content")
233	assert.WithinDuration(t, expected.CreatedAt, actual.CreatedAt, 10*time.Second)
234	assert.Equal(t, expected.State, actual.State, "State")
235	assertReviewCommentsEqual(t, expected.Comments, actual.Comments)
236}
237
238func assertReviewsEqual(t *testing.T, expected, actual []*base.Review) {
239	if assert.Len(t, actual, len(expected)) {
240		for i := range expected {
241			assertReviewEqual(t, expected[i], actual[i])
242		}
243	}
244}
245
246func assertReviewCommentEqual(t *testing.T, expected, actual *base.ReviewComment) {
247	assert.Equal(t, expected.ID, actual.ID)
248	assert.Equal(t, expected.InReplyTo, actual.InReplyTo)
249	assert.Equal(t, expected.Content, actual.Content)
250	assert.Equal(t, expected.TreePath, actual.TreePath)
251	assert.Equal(t, expected.DiffHunk, actual.DiffHunk)
252	assert.Equal(t, expected.Position, actual.Position)
253	assert.Equal(t, expected.Line, actual.Line)
254	assert.Equal(t, expected.CommitID, actual.CommitID)
255	assert.Equal(t, expected.PosterID, actual.PosterID)
256	assertReactionsEqual(t, expected.Reactions, actual.Reactions)
257	assertTimeEqual(t, expected.CreatedAt, actual.CreatedAt)
258	assertTimeEqual(t, expected.UpdatedAt, actual.UpdatedAt)
259}
260
261func assertReviewCommentsEqual(t *testing.T, expected, actual []*base.ReviewComment) {
262	if assert.Len(t, actual, len(expected)) {
263		for i := range expected {
264			assertReviewCommentEqual(t, expected[i], actual[i])
265		}
266	}
267}
268