PageRenderTime 28ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/Octokit.Tests.Integration/Clients/PullRequestsClientTests.cs

https://gitlab.com/WoomyNightClub/GitHub-API-.NET
C# | 899 lines | 667 code | 224 blank | 8 comment | 0 complexity | 452c88feee03b1a1ff751f06a5df84d2 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Octokit;
  6. using Octokit.Tests.Integration;
  7. using Octokit.Tests.Integration.Helpers;
  8. using Xunit;
  9. public class PullRequestsClientTests : IDisposable
  10. {
  11. private readonly IGitHubClient _github;
  12. private readonly IPullRequestsClient _fixture;
  13. private readonly RepositoryContext _context;
  14. private readonly IRepositoryCommentsClient _repositoryCommentsClient;
  15. const string branchName = "my-branch";
  16. const string otherBranchName = "my-other-branch";
  17. public PullRequestsClientTests()
  18. {
  19. _github = Helper.GetAuthenticatedClient();
  20. _fixture = _github.Repository.PullRequest;
  21. _repositoryCommentsClient = _github.Repository.Comment;
  22. _context = _github.CreateRepositoryContext("source-repo").Result;
  23. }
  24. [IntegrationTest]
  25. public async Task CanCreate()
  26. {
  27. await CreateTheWorld();
  28. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  29. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  30. Assert.Equal("a pull request", result.Title);
  31. }
  32. [IntegrationTest]
  33. public async Task CanCreateWithRepositoryId()
  34. {
  35. await CreateTheWorld();
  36. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  37. var result = await _fixture.Create(_context.Repository.Id, newPullRequest);
  38. Assert.Equal("a pull request", result.Title);
  39. }
  40. [IntegrationTest]
  41. public async Task CanGetForRepository()
  42. {
  43. await CreateTheWorld();
  44. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  45. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  46. var pullRequests = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName);
  47. Assert.Equal(1, pullRequests.Count);
  48. Assert.Equal(result.Title, pullRequests[0].Title);
  49. }
  50. [IntegrationTest]
  51. public async Task CanGetForRepositoryWithRepositoryId()
  52. {
  53. await CreateTheWorld();
  54. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  55. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  56. var pullRequests = await _fixture.GetAllForRepository(_context.Repository.Id);
  57. Assert.Equal(1, pullRequests.Count);
  58. Assert.Equal(result.Title, pullRequests[0].Title);
  59. }
  60. [IntegrationTest]
  61. public async Task ReturnsCorrectCountOfPullRequestsWithoutStart()
  62. {
  63. await CreateTheWorld();
  64. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  65. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  66. var options = new ApiOptions
  67. {
  68. PageSize = 3,
  69. PageCount = 1
  70. };
  71. var pullRequests = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, options);
  72. Assert.Equal(1, pullRequests.Count);
  73. Assert.Equal(result.Title, pullRequests[0].Title);
  74. }
  75. [IntegrationTest]
  76. public async Task ReturnsCorrectCountOfPullRequestsWithoutStartWithRepositoryId()
  77. {
  78. await CreateTheWorld();
  79. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  80. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  81. var options = new ApiOptions
  82. {
  83. PageSize = 3,
  84. PageCount = 1
  85. };
  86. var pullRequests = await _fixture.GetAllForRepository(_context.Repository.Id, options);
  87. Assert.Equal(1, pullRequests.Count);
  88. Assert.Equal(result.Title, pullRequests[0].Title);
  89. }
  90. [IntegrationTest]
  91. public async Task ReturnsCorrectCountOfPullRequestsWithStart()
  92. {
  93. await CreateTheWorld();
  94. var newPullRequest1 = new NewPullRequest("a pull request 1", branchName, "master");
  95. var newPullRequest2 = new NewPullRequest("a pull request 2", otherBranchName, "master");
  96. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest1);
  97. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest2);
  98. var options = new ApiOptions
  99. {
  100. PageSize = 1,
  101. PageCount = 1,
  102. StartPage = 1
  103. };
  104. var pullRequests = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, options);
  105. Assert.Equal(1, pullRequests.Count);
  106. Assert.Equal(result.Title, pullRequests[0].Title);
  107. }
  108. [IntegrationTest]
  109. public async Task ReturnsCorrectCountOfPullRequestsWithStartWithRepositoryId()
  110. {
  111. await CreateTheWorld();
  112. var newPullRequest1 = new NewPullRequest("a pull request 1", branchName, "master");
  113. var newPullRequest2 = new NewPullRequest("a pull request 2", otherBranchName, "master");
  114. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest1);
  115. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest2);
  116. var options = new ApiOptions
  117. {
  118. PageSize = 1,
  119. PageCount = 1,
  120. StartPage = 1
  121. };
  122. var pullRequests = await _fixture.GetAllForRepository(_context.Repository.Id, options);
  123. Assert.Equal(1, pullRequests.Count);
  124. Assert.Equal(result.Title, pullRequests[0].Title);
  125. }
  126. [IntegrationTest]
  127. public async Task ReturnsDistinctPullRequestsBasedOnStartPage()
  128. {
  129. await CreateTheWorld();
  130. var newPullRequest1 = new NewPullRequest("a pull request 1", branchName, "master");
  131. var newPullRequest2 = new NewPullRequest("a pull request 2", otherBranchName, "master");
  132. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest1);
  133. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest2);
  134. var startOptions = new ApiOptions
  135. {
  136. PageSize = 1,
  137. PageCount = 1
  138. };
  139. var firstPage = await _fixture.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName, startOptions);
  140. var skipStartOptions = new ApiOptions
  141. {
  142. PageSize = 1,
  143. PageCount = 1,
  144. StartPage = 2
  145. };
  146. var secondPage = await _fixture.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName, skipStartOptions);
  147. Assert.NotEqual(firstPage[0].Title, secondPage[0].Title);
  148. }
  149. [IntegrationTest]
  150. public async Task ReturnsDistinctPullRequestsBasedOnStartPageWithRepositoryId()
  151. {
  152. await CreateTheWorld();
  153. var newPullRequest1 = new NewPullRequest("a pull request 1", branchName, "master");
  154. var newPullRequest2 = new NewPullRequest("a pull request 2", otherBranchName, "master");
  155. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest1);
  156. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest2);
  157. var startOptions = new ApiOptions
  158. {
  159. PageSize = 1,
  160. PageCount = 1
  161. };
  162. var firstPage = await _fixture.GetAllForRepository(_context.Repository.Id, startOptions);
  163. var skipStartOptions = new ApiOptions
  164. {
  165. PageSize = 1,
  166. PageCount = 1,
  167. StartPage = 2
  168. };
  169. var secondPage = await _fixture.GetAllForRepository(_context.Repository.Id, skipStartOptions);
  170. Assert.NotEqual(firstPage[0].Title, secondPage[0].Title);
  171. }
  172. [IntegrationTest]
  173. public async Task CanGetOpenPullRequest()
  174. {
  175. await CreateTheWorld();
  176. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  177. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  178. var openPullRequests = new PullRequestRequest { State = ItemStateFilter.Open };
  179. var pullRequests = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, openPullRequests);
  180. Assert.Equal(1, pullRequests.Count);
  181. Assert.Equal(result.Title, pullRequests[0].Title);
  182. }
  183. [IntegrationTest]
  184. public async Task CanGetOpenPullRequestWithRepositoryId()
  185. {
  186. await CreateTheWorld();
  187. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  188. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  189. var openPullRequests = new PullRequestRequest { State = ItemStateFilter.Open };
  190. var pullRequests = await _fixture.GetAllForRepository(_context.Repository.Id, openPullRequests);
  191. Assert.Equal(1, pullRequests.Count);
  192. Assert.Equal(result.Title, pullRequests[0].Title);
  193. }
  194. [IntegrationTest]
  195. public async Task ReturnsCorrectCountOfPullRequestsWithoutStartParameterized()
  196. {
  197. await CreateTheWorld();
  198. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  199. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  200. var options = new ApiOptions
  201. {
  202. PageSize = 3,
  203. PageCount = 1
  204. };
  205. var openPullRequests = new PullRequestRequest { State = ItemStateFilter.Open };
  206. var pullRequests = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, openPullRequests, options);
  207. Assert.Equal(1, pullRequests.Count);
  208. Assert.Equal(result.Title, pullRequests[0].Title);
  209. }
  210. [IntegrationTest]
  211. public async Task ReturnsCorrectCountOfPullRequestsWithoutStartParameterizedWithRepositoryId()
  212. {
  213. await CreateTheWorld();
  214. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  215. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  216. var options = new ApiOptions
  217. {
  218. PageSize = 3,
  219. PageCount = 1
  220. };
  221. var openPullRequests = new PullRequestRequest { State = ItemStateFilter.Open };
  222. var pullRequests = await _fixture.GetAllForRepository(_context.Repository.Id, openPullRequests, options);
  223. Assert.Equal(1, pullRequests.Count);
  224. Assert.Equal(result.Title, pullRequests[0].Title);
  225. }
  226. [IntegrationTest]
  227. public async Task ReturnsCorrectCountOfPullRequestsWithStartParameterized()
  228. {
  229. await CreateTheWorld();
  230. var newPullRequest1 = new NewPullRequest("a pull request 1", branchName, "master");
  231. var newPullRequest2 = new NewPullRequest("a pull request 2", otherBranchName, "master");
  232. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest1);
  233. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest2);
  234. var options = new ApiOptions
  235. {
  236. PageSize = 1,
  237. PageCount = 1,
  238. StartPage = 1
  239. };
  240. var openPullRequests = new PullRequestRequest { State = ItemStateFilter.Open };
  241. var pullRequests = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, openPullRequests, options);
  242. Assert.Equal(1, pullRequests.Count);
  243. Assert.Equal(result.Title, pullRequests[0].Title);
  244. }
  245. [IntegrationTest]
  246. public async Task ReturnsCorrectCountOfPullRequestsWithStartParameterizedWithRepositoryId()
  247. {
  248. await CreateTheWorld();
  249. var newPullRequest1 = new NewPullRequest("a pull request 1", branchName, "master");
  250. var newPullRequest2 = new NewPullRequest("a pull request 2", otherBranchName, "master");
  251. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest1);
  252. var result = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest2);
  253. var options = new ApiOptions
  254. {
  255. PageSize = 1,
  256. PageCount = 1,
  257. StartPage = 1
  258. };
  259. var openPullRequests = new PullRequestRequest { State = ItemStateFilter.Open };
  260. var pullRequests = await _fixture.GetAllForRepository(_context.Repository.Id, openPullRequests, options);
  261. Assert.Equal(1, pullRequests.Count);
  262. Assert.Equal(result.Title, pullRequests[0].Title);
  263. }
  264. [IntegrationTest]
  265. public async Task ReturnsDistinctPullRequestsBasedOnStartPageParameterized()
  266. {
  267. await CreateTheWorld();
  268. var newPullRequest1 = new NewPullRequest("a pull request 1", branchName, "master");
  269. var newPullRequest2 = new NewPullRequest("a pull request 2", otherBranchName, "master");
  270. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest1);
  271. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest2);
  272. var openPullRequests = new PullRequestRequest { State = ItemStateFilter.Open };
  273. var startOptions = new ApiOptions
  274. {
  275. PageSize = 1,
  276. PageCount = 1
  277. };
  278. var firstPage = await _fixture.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName, openPullRequests, startOptions);
  279. var skipStartOptions = new ApiOptions
  280. {
  281. PageSize = 1,
  282. PageCount = 1,
  283. StartPage = 2
  284. };
  285. var secondPage = await _fixture.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName, openPullRequests, skipStartOptions);
  286. Assert.NotEqual(firstPage[0].Title, secondPage[0].Title);
  287. }
  288. [IntegrationTest]
  289. public async Task ReturnsDistinctPullRequestsBasedOnStartPageParameterizedWithRepositoryId()
  290. {
  291. await CreateTheWorld();
  292. var newPullRequest1 = new NewPullRequest("a pull request 1", branchName, "master");
  293. var newPullRequest2 = new NewPullRequest("a pull request 2", otherBranchName, "master");
  294. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest1);
  295. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest2);
  296. var openPullRequests = new PullRequestRequest { State = ItemStateFilter.Open };
  297. var startOptions = new ApiOptions
  298. {
  299. PageSize = 1,
  300. PageCount = 1
  301. };
  302. var firstPage = await _fixture.GetAllForRepository(_context.Repository.Id, openPullRequests, startOptions);
  303. var skipStartOptions = new ApiOptions
  304. {
  305. PageSize = 1,
  306. PageCount = 1,
  307. StartPage = 2
  308. };
  309. var secondPage = await _fixture.GetAllForRepository(_context.Repository.Id, openPullRequests, skipStartOptions);
  310. Assert.NotEqual(firstPage[0].Title, secondPage[0].Title);
  311. }
  312. [IntegrationTest]
  313. public async Task IgnoresOpenPullRequest()
  314. {
  315. await CreateTheWorld();
  316. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  317. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  318. var openPullRequests = new PullRequestRequest { State = ItemStateFilter.Closed };
  319. var pullRequests = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, openPullRequests);
  320. Assert.Empty(pullRequests);
  321. }
  322. [IntegrationTest]
  323. public async Task IgnoresOpenPullRequestWithRepositoryId()
  324. {
  325. await CreateTheWorld();
  326. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  327. await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  328. var openPullRequests = new PullRequestRequest { State = ItemStateFilter.Closed };
  329. var pullRequests = await _fixture.GetAllForRepository(_context.Repository.Id, openPullRequests);
  330. Assert.Empty(pullRequests);
  331. }
  332. [IntegrationTest]
  333. public async Task CanUpdate()
  334. {
  335. await CreateTheWorld();
  336. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  337. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  338. var updatePullRequest = new PullRequestUpdate { Title = "updated title", Body = "Hello New Body" };
  339. var result = await _fixture.Update(Helper.UserName, _context.RepositoryName, pullRequest.Number, updatePullRequest);
  340. Assert.Equal(updatePullRequest.Title, result.Title);
  341. Assert.Equal(updatePullRequest.Body, result.Body);
  342. }
  343. [IntegrationTest]
  344. public async Task CanUpdateWithRepositoryId()
  345. {
  346. await CreateTheWorld();
  347. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  348. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  349. var updatePullRequest = new PullRequestUpdate { Title = "updated title", Body = "Hello New Body" };
  350. var result = await _fixture.Update(_context.Repository.Id, pullRequest.Number, updatePullRequest);
  351. Assert.Equal(updatePullRequest.Title, result.Title);
  352. Assert.Equal(updatePullRequest.Body, result.Body);
  353. }
  354. [IntegrationTest]
  355. public async Task CanClose()
  356. {
  357. await CreateTheWorld();
  358. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  359. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  360. var updatePullRequest = new PullRequestUpdate { State = ItemState.Closed };
  361. var result = await _fixture.Update(Helper.UserName, _context.RepositoryName, pullRequest.Number, updatePullRequest);
  362. Assert.Equal(ItemState.Closed, result.State);
  363. Assert.Equal(pullRequest.Title, result.Title);
  364. Assert.Equal(pullRequest.Body, result.Body);
  365. }
  366. [IntegrationTest]
  367. public async Task CanFindClosedPullRequest()
  368. {
  369. await CreateTheWorld();
  370. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  371. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  372. var updatePullRequest = new PullRequestUpdate { State = ItemState.Closed };
  373. await _fixture.Update(Helper.UserName, _context.RepositoryName, pullRequest.Number, updatePullRequest);
  374. var closedPullRequests = new PullRequestRequest { State = ItemStateFilter.Closed };
  375. var pullRequests = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, closedPullRequests);
  376. Assert.Equal(1, pullRequests.Count);
  377. }
  378. [IntegrationTest]
  379. public async Task CanSortPullRequests()
  380. {
  381. await CreateTheWorld();
  382. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  383. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  384. var newPullRequest2 = new NewPullRequest("another pull request", otherBranchName, "master");
  385. var anotherPullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest2);
  386. var updatePullRequest = new PullRequestUpdate { Body = "This is the body" };
  387. await _fixture.Update(Helper.UserName, _context.RepositoryName, pullRequest.Number, updatePullRequest);
  388. var sortPullRequestsByUpdated = new PullRequestRequest { SortProperty = PullRequestSort.Updated, SortDirection = SortDirection.Ascending };
  389. var pullRequests = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, sortPullRequestsByUpdated);
  390. Assert.Equal(anotherPullRequest.Title, pullRequests[0].Title);
  391. var sortPullRequestsByLongRunning = new PullRequestRequest { SortProperty = PullRequestSort.LongRunning };
  392. var pullRequestsByLongRunning = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, sortPullRequestsByLongRunning);
  393. Assert.Equal(pullRequest.Title, pullRequestsByLongRunning[0].Title);
  394. }
  395. [IntegrationTest]
  396. public async Task CanSpecifyDirectionOfSort()
  397. {
  398. await CreateTheWorld();
  399. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  400. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  401. var newPullRequest2 = new NewPullRequest("another pull request", otherBranchName, "master");
  402. var anotherPullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest2);
  403. var pullRequests = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, new PullRequestRequest { SortDirection = SortDirection.Ascending });
  404. Assert.Equal(pullRequest.Title, pullRequests[0].Title);
  405. var pullRequestsDescending = await _fixture.GetAllForRepository(Helper.UserName, _context.RepositoryName, new PullRequestRequest());
  406. Assert.Equal(anotherPullRequest.Title, pullRequestsDescending[0].Title);
  407. }
  408. [IntegrationTest]
  409. public async Task IsNotMergedInitially()
  410. {
  411. await CreateTheWorld();
  412. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  413. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  414. var result = await _fixture.Merged(Helper.UserName, _context.RepositoryName, pullRequest.Number);
  415. Assert.False(result);
  416. }
  417. [IntegrationTest]
  418. public async Task IsNotMergedInitiallyWithRepositoryId()
  419. {
  420. await CreateTheWorld();
  421. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  422. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  423. var result = await _fixture.Merged(_context.Repository.Id, pullRequest.Number);
  424. Assert.False(result);
  425. }
  426. [IntegrationTest]
  427. public async Task CanBeMerged()
  428. {
  429. await CreateTheWorld();
  430. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  431. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  432. var merge = new MergePullRequest { CommitMessage = "thing the thing" };
  433. var result = await _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge);
  434. Assert.True(result.Merged);
  435. }
  436. [IntegrationTest]
  437. public async Task CanBeMergedWithRepositoryId()
  438. {
  439. await CreateTheWorld();
  440. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  441. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  442. var merge = new MergePullRequest { CommitMessage = "thing the thing" };
  443. var result = await _fixture.Merge(_context.Repository.Id, pullRequest.Number, merge);
  444. Assert.True(result.Merged);
  445. }
  446. [IntegrationTest]
  447. public async Task CanBeMergedWithNoOptionalInput()
  448. {
  449. await CreateTheWorld();
  450. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  451. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  452. var merge = new MergePullRequest();
  453. var result = await _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge);
  454. Assert.True(result.Merged);
  455. }
  456. [IntegrationTest]
  457. public async Task CanBeMergedWithShaSpecified()
  458. {
  459. await CreateTheWorld();
  460. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  461. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  462. var merge = new MergePullRequest { CommitMessage = "thing the thing", Sha = pullRequest.Head.Sha };
  463. var result = await _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge);
  464. Assert.True(result.Merged);
  465. }
  466. [IntegrationTest]
  467. public async Task CanBeMergedWithSquashCommit()
  468. {
  469. await CreateTheWorld();
  470. var newPullRequest = new NewPullRequest("squash commit pull request", branchName, "master");
  471. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  472. var merge = new MergePullRequest { CommitMessage = "fake commit message", CommitTitle = "fake title", Squash = true };
  473. var result = await _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge);
  474. var commit = await _github.Repository.Commit.Get(_context.RepositoryOwner, _context.RepositoryName, result.Sha);
  475. Assert.True(result.Merged);
  476. Assert.Equal("fake title\n\nfake commit message", commit.Commit.Message);
  477. }
  478. [IntegrationTest]
  479. public async Task CannotBeMergedDueMismatchConflict()
  480. {
  481. await CreateTheWorld();
  482. var fakeSha = new string('f', 40);
  483. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  484. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  485. var merge = new MergePullRequest { Sha = fakeSha };
  486. var ex = await Assert.ThrowsAsync<PullRequestMismatchException>(() => _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge));
  487. Assert.True(ex.Message.StartsWith("Head branch was modified"));
  488. }
  489. [IntegrationTest(Skip = "this PR is actually mergeable - rewrite the test")]
  490. public async Task CannotBeMergedDueNotInMergeableState()
  491. {
  492. await CreateTheWorld();
  493. var master = await _github.Git.Reference.Get(Helper.UserName, _context.RepositoryName, "heads/master");
  494. var newMasterTree = await CreateTree(new Dictionary<string, string> { { "README.md", "Hello World, we meet again!" } });
  495. var masterCommit = await CreateCommit("Commit in master", newMasterTree.Sha, master.Object.Sha);
  496. await _github.Git.Reference.Update(Helper.UserName, _context.RepositoryName, "heads/master", new ReferenceUpdate(masterCommit.Sha));
  497. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  498. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  499. await Task.Delay(TimeSpan.FromSeconds(5));
  500. var updatedPullRequest = await _fixture.Get(Helper.UserName, _context.RepositoryName, pullRequest.Number);
  501. Assert.False(updatedPullRequest.Mergeable);
  502. var merge = new MergePullRequest { Sha = pullRequest.Head.Sha };
  503. var ex = await Assert.ThrowsAsync<PullRequestNotMergeableException>(() => _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge));
  504. Assert.True(ex.Message.Equals("Pull Request is not mergeable"));
  505. }
  506. [IntegrationTest]
  507. public async Task UpdatesMaster()
  508. {
  509. await CreateTheWorld();
  510. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  511. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  512. var merge = new MergePullRequest { CommitMessage = "thing the thing" };
  513. var result = await _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge);
  514. var master = await _github.Git.Reference.Get(Helper.UserName, _context.RepositoryName, "heads/master");
  515. Assert.Equal(result.Sha, master.Object.Sha);
  516. }
  517. [IntegrationTest]
  518. public async Task CanBrowseCommits()
  519. {
  520. await CreateTheWorld();
  521. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  522. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  523. var result = await _fixture.Commits(Helper.UserName, _context.RepositoryName, pullRequest.Number);
  524. Assert.Equal(1, result.Count);
  525. Assert.Equal("this is the commit to merge into the pull request", result[0].Commit.Message);
  526. }
  527. [IntegrationTest]
  528. public async Task CanBrowseCommitsWithRepositoryId()
  529. {
  530. await CreateTheWorld();
  531. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  532. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  533. var result = await _fixture.Commits(_context.Repository.Id, pullRequest.Number);
  534. Assert.Equal(1, result.Count);
  535. Assert.Equal("this is the commit to merge into the pull request", result[0].Commit.Message);
  536. }
  537. [IntegrationTest]
  538. public async Task CanGetCommitsAndCommentCount()
  539. {
  540. await CreateTheWorld();
  541. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  542. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  543. // create new commit for branch
  544. const string commitMessage = "Another commit in branch";
  545. var branch = await _github.Git.Reference.Get(Helper.UserName, _context.RepositoryName, "heads/" + branchName);
  546. var newTree = await CreateTree(new Dictionary<string, string> { { "README.md", "Hello World!" } });
  547. var newCommit = await CreateCommit(commitMessage, newTree.Sha, branch.Object.Sha);
  548. await _github.Git.Reference.Update(Helper.UserName, _context.RepositoryName, "heads/" + branchName, new ReferenceUpdate(newCommit.Sha));
  549. await _repositoryCommentsClient.Create(Helper.UserName, _context.RepositoryName, newCommit.Sha, new NewCommitComment("I am a nice comment") { Path = "README.md", Position = 1 });
  550. // don't try this at home
  551. await Task.Delay(TimeSpan.FromSeconds(5));
  552. var result = await _fixture.Commits(Helper.UserName, _context.RepositoryName, pullRequest.Number);
  553. Assert.Equal(2, result.Count);
  554. Assert.Equal("this is the commit to merge into the pull request", result[0].Commit.Message);
  555. Assert.Equal(0, result[0].Commit.CommentCount);
  556. Assert.Equal(commitMessage, result[1].Commit.Message);
  557. Assert.Equal(1, result[1].Commit.CommentCount);
  558. }
  559. [IntegrationTest]
  560. public async Task CanGetCommitsAndCommentCountWithRepositoryId()
  561. {
  562. await CreateTheWorld();
  563. var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
  564. var pullRequest = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);
  565. // create new commit for branch
  566. const string commitMessage = "Another commit in branch";
  567. var branch = await _github.Git.Reference.Get(Helper.UserName, _context.RepositoryName, "heads/" + branchName);
  568. var newTree = await CreateTree(new Dictionary<string, string> { { "README.md", "Hello World!" } });
  569. var newCommit = await CreateCommit(commitMessage, newTree.Sha, branch.Object.Sha);
  570. await _github.Git.Reference.Update(Helper.UserName, _context.RepositoryName, "heads/" + branchName, new ReferenceUpdate(newCommit.Sha));
  571. await _repositoryCommentsClient.Create(Helper.UserName, _context.RepositoryName, newCommit.Sha, new NewCommitComment("I am a nice comment") { Path = "README.md", Position = 1 });
  572. // don't try this at home
  573. await Task.Delay(TimeSpan.FromSeconds(5));
  574. var result = await _fixture.Commits(_context.Repository.Id, pullRequest.Number);
  575. Assert.Equal(2, result.Count);
  576. Assert.Equal("this is the commit to merge into the pull request", result[0].Commit.Message);
  577. Assert.Equal(0, result[0].Commit.CommentCount);
  578. Assert.Equal(commitMessage, result[1].Commit.Message);
  579. Assert.Equal(1, result[1].Commit.CommentCount);
  580. }
  581. [IntegrationTest]
  582. public async Task CanBrowseFiles()
  583. {
  584. var expectedFiles = new List<PullRequestFile>
  585. {
  586. new PullRequestFile(null, "Octokit.Tests.Integration/Clients/ReferencesClientTests.cs", null, 8, 3, 11, null, null, null, null),
  587. new PullRequestFile(null, "Octokit/Clients/ApiPagination.cs", null, 21, 6, 27, null, null, null, null),
  588. new PullRequestFile(null, "Octokit/Helpers/IApiPagination.cs", null, 1, 1, 2, null, null, null, null),
  589. new PullRequestFile(null, "Octokit/Http/ApiConnection.cs", null, 1, 1, 2, null, null, null, null)
  590. };
  591. var result = await _fixture.Files("octokit", "octokit.net", 288);
  592. Assert.Equal(4, result.Count);
  593. Assert.True(expectedFiles.All(expectedFile => result.Any(file => file.FileName.Equals(expectedFile.FileName))));
  594. foreach (var file in result)
  595. {
  596. var expectedFile = expectedFiles.Find(prf => file.FileName.Equals(prf.FileName));
  597. Assert.Equal(expectedFile.Changes, file.Changes);
  598. Assert.Equal(expectedFile.Additions, file.Additions);
  599. Assert.Equal(expectedFile.Deletions, file.Deletions);
  600. }
  601. }
  602. [IntegrationTest]
  603. public async Task CanBrowseFilesWithRepositoryId()
  604. {
  605. var expectedFiles = new List<PullRequestFile>
  606. {
  607. new PullRequestFile(null, "Octokit.Tests.Integration/Clients/ReferencesClientTests.cs", null, 8, 3, 11, null, null, null, null),
  608. new PullRequestFile(null, "Octokit/Clients/ApiPagination.cs", null, 21, 6, 27, null, null, null, null),
  609. new PullRequestFile(null, "Octokit/Helpers/IApiPagination.cs", null, 1, 1, 2, null, null, null, null),
  610. new PullRequestFile(null, "Octokit/Http/ApiConnection.cs", null, 1, 1, 2, null, null, null, null)
  611. };
  612. var result = await _fixture.Files(7528679, 288);
  613. Assert.Equal(4, result.Count);
  614. Assert.True(expectedFiles.All(expectedFile => result.Any(file => file.FileName.Equals(expectedFile.FileName))));
  615. foreach (var file in result)
  616. {
  617. var expectedFile = expectedFiles.Find(prf => file.FileName.Equals(prf.FileName));
  618. Assert.Equal(expectedFile.Changes, file.Changes);
  619. Assert.Equal(expectedFile.Additions, file.Additions);
  620. Assert.Equal(expectedFile.Deletions, file.Deletions);
  621. }
  622. }
  623. async Task CreateTheWorld()
  624. {
  625. var master = await _github.Git.Reference.Get(Helper.UserName, _context.RepositoryName, "heads/master");
  626. // create new commit for master branch
  627. var newMasterTree = await CreateTree(new Dictionary<string, string> { { "README.md", "Hello World!" } });
  628. var newMaster = await CreateCommit("baseline for pull request", newMasterTree.Sha, master.Object.Sha);
  629. // update master
  630. await _github.Git.Reference.Update(Helper.UserName, _context.RepositoryName, "heads/master", new ReferenceUpdate(newMaster.Sha));
  631. // create new commit for feature branch
  632. var featureBranchTree = await CreateTree(new Dictionary<string, string> { { "README.md", "I am overwriting this blob with something new" } });
  633. var featureBranchCommit = await CreateCommit("this is the commit to merge into the pull request", featureBranchTree.Sha, newMaster.Sha);
  634. // create branch
  635. await _github.Git.Reference.Create(Helper.UserName, _context.RepositoryName, new NewReference("refs/heads/my-branch", featureBranchCommit.Sha));
  636. var otherFeatureBranchTree = await CreateTree(new Dictionary<string, string> { { "README.md", "I am overwriting this blob with something else" } });
  637. var otherFeatureBranchCommit = await CreateCommit("this is the other commit to merge into the other pull request", otherFeatureBranchTree.Sha, newMaster.Sha);
  638. await _github.Git.Reference.Create(Helper.UserName, _context.RepositoryName, new NewReference("refs/heads/my-other-branch", otherFeatureBranchCommit.Sha));
  639. }
  640. async Task<TreeResponse> CreateTree(IEnumerable<KeyValuePair<string, string>> treeContents)
  641. {
  642. var collection = new List<NewTreeItem>();
  643. foreach (var c in treeContents)
  644. {
  645. var baselineBlob = new NewBlob
  646. {
  647. Content = c.Value,
  648. Encoding = EncodingType.Utf8
  649. };
  650. var baselineBlobResult = await _github.Git.Blob.Create(Helper.UserName, _context.RepositoryName, baselineBlob);
  651. collection.Add(new NewTreeItem
  652. {
  653. Type = TreeType.Blob,
  654. Mode = FileMode.File,
  655. Path = c.Key,
  656. Sha = baselineBlobResult.Sha
  657. });
  658. }
  659. var newTree = new NewTree();
  660. foreach (var item in collection)
  661. {
  662. newTree.Tree.Add(item);
  663. }
  664. return await _github.Git.Tree.Create(Helper.UserName, _context.RepositoryName, newTree);
  665. }
  666. async Task<Commit> CreateCommit(string message, string sha, string parent)
  667. {
  668. var newCommit = new NewCommit(message, sha, parent);
  669. return await _github.Git.Commit.Create(Helper.UserName, _context.RepositoryName, newCommit);
  670. }
  671. public void Dispose()
  672. {
  673. _context.Dispose();
  674. }
  675. }