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

/Octokit.Tests.Integration/Clients/IssuesClientTests.cs

https://gitlab.com/WoomyNightClub/GitHub-API-.NET
C# | 1129 lines | 888 code | 223 blank | 18 comment | 22 complexity | 391ceccee50263a9070d1241ddf94501 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Octokit;
  7. using Octokit.Tests.Integration;
  8. using Octokit.Tests.Integration.Helpers;
  9. using Xunit;
  10. public class IssuesClientTests : IDisposable
  11. {
  12. private readonly IGitHubClient _github;
  13. private readonly RepositoryContext _context;
  14. private readonly IIssuesClient _issuesClient;
  15. public IssuesClientTests()
  16. {
  17. _github = Helper.GetAuthenticatedClient();
  18. var repoName = Helper.MakeNameWithTimestamp("public-repo");
  19. _issuesClient = _github.Issue;
  20. _context = _github.CreateRepositoryContext(new NewRepository(repoName)).Result;
  21. }
  22. [IntegrationTest]
  23. public async Task CanDeserializeIssue()
  24. {
  25. const string title = "a test issue";
  26. const string description = "A new unassigned issue";
  27. var newIssue = new NewIssue(title) { Body = description };
  28. var issue = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue);
  29. Assert.True(issue.Id > 0);
  30. Assert.False(issue.Locked);
  31. Assert.Equal(title, issue.Title);
  32. Assert.Equal(description, issue.Body);
  33. var retrieved = await _issuesClient.Get(_context.RepositoryOwner, _context.RepositoryName, issue.Number);
  34. Assert.True(retrieved.Id > 0);
  35. Assert.False(retrieved.Locked);
  36. Assert.Equal(title, retrieved.Title);
  37. Assert.Equal(description, retrieved.Body);
  38. }
  39. [IntegrationTest]
  40. public async Task CanDeserializeIssueWithRepositoryId()
  41. {
  42. const string title = "a test issue";
  43. const string description = "A new unassigned issue";
  44. var newIssue = new NewIssue(title) { Body = description };
  45. var issue = await _issuesClient.Create(_context.Repository.Id, newIssue);
  46. Assert.True(issue.Id > 0);
  47. Assert.False(issue.Locked);
  48. Assert.Equal(title, issue.Title);
  49. Assert.Equal(description, issue.Body);
  50. var retrieved = await _issuesClient.Get(_context.Repository.Id, issue.Number);
  51. Assert.True(retrieved.Id > 0);
  52. Assert.False(retrieved.Locked);
  53. Assert.Equal(title, retrieved.Title);
  54. Assert.Equal(description, retrieved.Body);
  55. }
  56. [IntegrationTest]
  57. public async Task ReturnsPageOfIssuesForARepository()
  58. {
  59. var options = new ApiOptions
  60. {
  61. PageSize = 5,
  62. PageCount = 1
  63. };
  64. var issues = await _issuesClient.GetAllForRepository("libgit2", "libgit2sharp", options);
  65. Assert.Equal(5, issues.Count);
  66. }
  67. [IntegrationTest]
  68. public async Task ReturnsPageOfIssuesForARepositoryWithRepositoryId()
  69. {
  70. var options = new ApiOptions
  71. {
  72. PageSize = 5,
  73. PageCount = 1
  74. };
  75. var issues = await _issuesClient.GetAllForRepository(1415168, options);
  76. Assert.Equal(5, issues.Count);
  77. }
  78. [IntegrationTest]
  79. public async Task ReturnsPageOfIssuesForARepositoryWithStartPage()
  80. {
  81. var options = new ApiOptions
  82. {
  83. PageSize = 5,
  84. PageCount = 1,
  85. StartPage = 2
  86. };
  87. var issues = await _issuesClient.GetAllForRepository("libgit2", "libgit2sharp", options);
  88. Assert.Equal(5, issues.Count);
  89. }
  90. [IntegrationTest]
  91. public async Task ReturnsPageOfIssuesForARepositoryWithRepositoryIdWithStartPage()
  92. {
  93. var options = new ApiOptions
  94. {
  95. PageSize = 5,
  96. PageCount = 1,
  97. StartPage = 2
  98. };
  99. var issues = await _issuesClient.GetAllForRepository(1415168, options);
  100. Assert.Equal(5, issues.Count);
  101. }
  102. [IntegrationTest]
  103. public async Task ReturnsPageOfIssuesFromStartForARepository()
  104. {
  105. var first = new ApiOptions
  106. {
  107. PageSize = 5,
  108. PageCount = 1
  109. };
  110. var firstPage = await _issuesClient.GetAllForRepository("libgit2", "libgit2sharp", first);
  111. var second = new ApiOptions
  112. {
  113. PageSize = 5,
  114. PageCount = 1,
  115. StartPage = 2
  116. };
  117. var secondPage = await _issuesClient.GetAllForRepository("libgit2", "libgit2sharp", second);
  118. Assert.Equal(5, firstPage.Count);
  119. Assert.Equal(5, secondPage.Count);
  120. Assert.NotEqual(firstPage[0].Id, secondPage[0].Id);
  121. Assert.NotEqual(firstPage[1].Id, secondPage[1].Id);
  122. Assert.NotEqual(firstPage[2].Id, secondPage[2].Id);
  123. Assert.NotEqual(firstPage[3].Id, secondPage[3].Id);
  124. Assert.NotEqual(firstPage[4].Id, secondPage[4].Id);
  125. }
  126. [IntegrationTest]
  127. public async Task ReturnsPageOfIssuesFromStartForARepositoryWithRepositoryId()
  128. {
  129. var first = new ApiOptions
  130. {
  131. PageSize = 5,
  132. PageCount = 1
  133. };
  134. var firstPage = await _issuesClient.GetAllForRepository(1415168, first);
  135. var second = new ApiOptions
  136. {
  137. PageSize = 5,
  138. PageCount = 1,
  139. StartPage = 2
  140. };
  141. var secondPage = await _issuesClient.GetAllForRepository(1415168, second);
  142. Assert.Equal(5, firstPage.Count);
  143. Assert.Equal(5, secondPage.Count);
  144. Assert.NotEqual(firstPage[0].Id, secondPage[0].Id);
  145. Assert.NotEqual(firstPage[1].Id, secondPage[1].Id);
  146. Assert.NotEqual(firstPage[2].Id, secondPage[2].Id);
  147. Assert.NotEqual(firstPage[3].Id, secondPage[3].Id);
  148. Assert.NotEqual(firstPage[4].Id, secondPage[4].Id);
  149. }
  150. [IntegrationTest]
  151. public async Task CanCreateRetrieveAndCloseIssue()
  152. {
  153. var newIssue = new NewIssue("a test issue") { Body = "A new unassigned issue" };
  154. var issue = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue);
  155. try
  156. {
  157. Assert.NotNull(issue);
  158. var retrieved = await _issuesClient.Get(_context.RepositoryOwner, _context.RepositoryName, issue.Number);
  159. var all = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName);
  160. Assert.NotNull(retrieved);
  161. Assert.True(all.Any(i => i.Number == retrieved.Number));
  162. }
  163. finally
  164. {
  165. var closed = _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, issue.Number, new IssueUpdate { State = ItemState.Closed }).Result;
  166. Assert.NotNull(closed);
  167. }
  168. }
  169. [IntegrationTest]
  170. public async Task CanCreateRetrieveAndCloseIssueWithRepositoryId()
  171. {
  172. var newIssue = new NewIssue("a test issue") { Body = "A new unassigned issue" };
  173. var issue = await _issuesClient.Create(_context.Repository.Id, newIssue);
  174. try
  175. {
  176. Assert.NotNull(issue);
  177. var retrieved = await _issuesClient.Get(_context.Repository.Id, issue.Number);
  178. var all = await _issuesClient.GetAllForRepository(_context.Repository.Id);
  179. Assert.NotNull(retrieved);
  180. Assert.True(all.Any(i => i.Number == retrieved.Number));
  181. }
  182. finally
  183. {
  184. var closed = _issuesClient.Update(_context.Repository.Id, issue.Number, new IssueUpdate { State = ItemState.Closed }).Result;
  185. Assert.NotNull(closed);
  186. }
  187. }
  188. [IntegrationTest]
  189. public async Task CanLockAndUnlockIssue()
  190. {
  191. var newIssue = new NewIssue("a test issue") { Body = "A new unassigned issue" };
  192. var issue = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue);
  193. Assert.False(issue.Locked);
  194. await _issuesClient.Lock(_context.RepositoryOwner, _context.RepositoryName, issue.Number);
  195. var retrieved = await _issuesClient.Get(_context.RepositoryOwner, _context.RepositoryName, issue.Number);
  196. Assert.NotNull(retrieved);
  197. Assert.True(retrieved.Locked);
  198. await _issuesClient.Unlock(_context.RepositoryOwner, _context.RepositoryName, issue.Number);
  199. retrieved = await _issuesClient.Get(_context.RepositoryOwner, _context.RepositoryName, issue.Number);
  200. Assert.NotNull(retrieved);
  201. Assert.False(retrieved.Locked);
  202. }
  203. [IntegrationTest]
  204. public async Task CanLockAndUnlockIssueWithRepositoryId()
  205. {
  206. var newIssue = new NewIssue("a test issue") { Body = "A new unassigned issue" };
  207. var issue = await _issuesClient.Create(_context.Repository.Id, newIssue);
  208. Assert.False(issue.Locked);
  209. await _issuesClient.Lock(_context.Repository.Id, issue.Number);
  210. var retrieved = await _issuesClient.Get(_context.Repository.Id, issue.Number);
  211. Assert.NotNull(retrieved);
  212. Assert.True(retrieved.Locked);
  213. await _issuesClient.Unlock(_context.Repository.Id, issue.Number);
  214. retrieved = await _issuesClient.Get(_context.Repository.Id, issue.Number);
  215. Assert.NotNull(retrieved);
  216. Assert.False(retrieved.Locked);
  217. }
  218. [IntegrationTest]
  219. public async Task CanListOpenIssuesWithDefaultSort()
  220. {
  221. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  222. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  223. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  224. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  225. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  226. await Task.Delay(1000);
  227. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  228. await Task.Delay(1000);
  229. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue3);
  230. var closed = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue4);
  231. await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, closed.Number,
  232. new IssueUpdate { State = ItemState.Closed });
  233. var issues = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName);
  234. Assert.Equal(3, issues.Count);
  235. Assert.Equal("A test issue3", issues[0].Title);
  236. Assert.Equal("A test issue2", issues[1].Title);
  237. Assert.Equal("A test issue1", issues[2].Title);
  238. }
  239. [IntegrationTest]
  240. public async Task CanListOpenIssuesWithDefaultSortWithRepositoryId()
  241. {
  242. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  243. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  244. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  245. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  246. await _issuesClient.Create(_context.Repository.Id, newIssue1);
  247. await Task.Delay(1000);
  248. await _issuesClient.Create(_context.Repository.Id, newIssue2);
  249. await Task.Delay(1000);
  250. await _issuesClient.Create(_context.Repository.Id, newIssue3);
  251. var closed = await _issuesClient.Create(_context.Repository.Id, newIssue4);
  252. await _issuesClient.Update(_context.Repository.Id, closed.Number,
  253. new IssueUpdate { State = ItemState.Closed });
  254. var issues = await _issuesClient.GetAllForRepository(_context.Repository.Id);
  255. Assert.Equal(3, issues.Count);
  256. Assert.Equal("A test issue3", issues[0].Title);
  257. Assert.Equal("A test issue2", issues[1].Title);
  258. Assert.Equal("A test issue1", issues[2].Title);
  259. }
  260. [IntegrationTest]
  261. public async Task CanListIssuesWithAscendingSort()
  262. {
  263. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  264. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  265. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  266. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  267. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  268. await Task.Delay(1000);
  269. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  270. await Task.Delay(1000);
  271. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue3);
  272. var closed = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue4);
  273. await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, closed.Number,
  274. new IssueUpdate { State = ItemState.Closed });
  275. var issues = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  276. new RepositoryIssueRequest { SortDirection = SortDirection.Ascending });
  277. Assert.Equal(3, issues.Count);
  278. Assert.Equal("A test issue1", issues[0].Title);
  279. Assert.Equal("A test issue2", issues[1].Title);
  280. Assert.Equal("A test issue3", issues[2].Title);
  281. }
  282. [IntegrationTest]
  283. public async Task CanListIssuesWithAscendingSortWithRepositoryId()
  284. {
  285. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  286. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  287. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  288. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  289. await _issuesClient.Create(_context.Repository.Id, newIssue1);
  290. await Task.Delay(1000);
  291. await _issuesClient.Create(_context.Repository.Id, newIssue2);
  292. await Task.Delay(1000);
  293. await _issuesClient.Create(_context.Repository.Id, newIssue3);
  294. var closed = await _issuesClient.Create(_context.Repository.Id, newIssue4);
  295. await _issuesClient.Update(_context.Repository.Id, closed.Number,
  296. new IssueUpdate { State = ItemState.Closed });
  297. var issues = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  298. new RepositoryIssueRequest { SortDirection = SortDirection.Ascending });
  299. Assert.Equal(3, issues.Count);
  300. Assert.Equal("A test issue1", issues[0].Title);
  301. Assert.Equal("A test issue2", issues[1].Title);
  302. Assert.Equal("A test issue3", issues[2].Title);
  303. }
  304. [IntegrationTest]
  305. public async Task CanListClosedIssues()
  306. {
  307. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  308. var newIssue2 = new NewIssue("A closed issue") { Body = "A new unassigned issue" };
  309. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  310. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  311. var closed = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  312. await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, closed.Number,
  313. new IssueUpdate { State = ItemState.Closed });
  314. var issues = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  315. new RepositoryIssueRequest { State = ItemStateFilter.Closed });
  316. Assert.Equal(1, issues.Count);
  317. Assert.Equal("A closed issue", issues[0].Title);
  318. }
  319. [IntegrationTest]
  320. public async Task CanListClosedIssuesWithRepositoryId()
  321. {
  322. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  323. var newIssue2 = new NewIssue("A closed issue") { Body = "A new unassigned issue" };
  324. await _issuesClient.Create(_context.Repository.Id, newIssue1);
  325. await _issuesClient.Create(_context.Repository.Id, newIssue2);
  326. var closed = await _issuesClient.Create(_context.Repository.Id, newIssue2);
  327. await _issuesClient.Update(_context.Repository.Id, closed.Number,
  328. new IssueUpdate { State = ItemState.Closed });
  329. var issues = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  330. new RepositoryIssueRequest { State = ItemStateFilter.Closed });
  331. Assert.Equal(1, issues.Count);
  332. Assert.Equal("A closed issue", issues[0].Title);
  333. }
  334. [IntegrationTest]
  335. public async Task CanListMilestoneIssues()
  336. {
  337. var milestone = await _issuesClient.Milestone.Create(_context.RepositoryOwner, _context.RepositoryName, new NewMilestone("milestone"));
  338. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  339. var newIssue2 = new NewIssue("A milestone issue") { Body = "A new unassigned issue", Milestone = milestone.Number };
  340. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  341. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  342. var issues = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  343. new RepositoryIssueRequest { Milestone = milestone.Number.ToString(CultureInfo.InvariantCulture) });
  344. Assert.Equal(1, issues.Count);
  345. Assert.Equal("A milestone issue", issues[0].Title);
  346. }
  347. [IntegrationTest]
  348. public async Task CanListMilestoneIssuesWithRepositoryId()
  349. {
  350. var milestone = await _issuesClient.Milestone.Create(_context.RepositoryOwner, _context.RepositoryName, new NewMilestone("milestone"));
  351. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  352. var newIssue2 = new NewIssue("A milestone issue") { Body = "A new unassigned issue", Milestone = milestone.Number };
  353. await _issuesClient.Create(_context.Repository.Id, newIssue1);
  354. await _issuesClient.Create(_context.Repository.Id, newIssue2);
  355. var issues = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  356. new RepositoryIssueRequest { Milestone = milestone.Number.ToString(CultureInfo.InvariantCulture) });
  357. Assert.Equal(1, issues.Count);
  358. Assert.Equal("A milestone issue", issues[0].Title);
  359. }
  360. [IntegrationTest]
  361. public async Task CanRetrieveAllIssuesWithApiOptionsWithoutStart()
  362. {
  363. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  364. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  365. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  366. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  367. var issue1 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  368. var issue2 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  369. var issue3 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue3);
  370. var issue4 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue4);
  371. await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, issue4.Number, new IssueUpdate { State = ItemState.Closed });
  372. var request = new RepositoryIssueRequest { State = ItemStateFilter.All };
  373. var options = new ApiOptions
  374. {
  375. PageSize = 4,
  376. PageCount = 1
  377. };
  378. var retrieved = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName, request, options);
  379. Assert.Equal(4, retrieved.Count);
  380. Assert.True(retrieved.Any(i => i.Number == issue1.Number));
  381. Assert.True(retrieved.Any(i => i.Number == issue2.Number));
  382. Assert.True(retrieved.Any(i => i.Number == issue3.Number));
  383. Assert.True(retrieved.Any(i => i.Number == issue4.Number));
  384. }
  385. [IntegrationTest]
  386. public async Task CanRetrieveAllIssuesWithApiOptionsWithoutStartWithRepositoryId()
  387. {
  388. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  389. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  390. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  391. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  392. var issue1 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  393. var issue2 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  394. var issue3 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue3);
  395. var issue4 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue4);
  396. await _issuesClient.Update(_context.Repository.Id, issue4.Number, new IssueUpdate { State = ItemState.Closed });
  397. var request = new RepositoryIssueRequest { State = ItemStateFilter.All };
  398. var options = new ApiOptions
  399. {
  400. PageSize = 4,
  401. PageCount = 1
  402. };
  403. var retrieved = await _issuesClient.GetAllForRepository(_context.Repository.Id, request, options);
  404. Assert.Equal(4, retrieved.Count);
  405. Assert.True(retrieved.Any(i => i.Number == issue1.Number));
  406. Assert.True(retrieved.Any(i => i.Number == issue2.Number));
  407. Assert.True(retrieved.Any(i => i.Number == issue3.Number));
  408. Assert.True(retrieved.Any(i => i.Number == issue4.Number));
  409. }
  410. [IntegrationTest]
  411. public async Task CanRetrieveAllIssuesWithApiOptionsWithStart()
  412. {
  413. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  414. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  415. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  416. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  417. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  418. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  419. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue3);
  420. var issue4 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue4);
  421. await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, issue4.Number, new IssueUpdate { State = ItemState.Closed });
  422. var request = new RepositoryIssueRequest { State = ItemStateFilter.All, SortDirection = SortDirection.Ascending };
  423. var options = new ApiOptions
  424. {
  425. PageSize = 1,
  426. PageCount = 1,
  427. StartPage = 4
  428. };
  429. var retrieved = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName, request, options);
  430. Assert.Equal(1, retrieved.Count);
  431. Assert.True(retrieved.Any(i => i.Number == issue4.Number));
  432. }
  433. [IntegrationTest]
  434. public async Task CanRetrieveAllIssuesWithApiOptionsWithStartWithRepositoryId()
  435. {
  436. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  437. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  438. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  439. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  440. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  441. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  442. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue3);
  443. var issue4 = await _issuesClient.Create(_context.Repository.Id, newIssue4);
  444. await _issuesClient.Update(_context.Repository.Id, issue4.Number, new IssueUpdate { State = ItemState.Closed });
  445. var request = new RepositoryIssueRequest { State = ItemStateFilter.All, SortDirection = SortDirection.Ascending };
  446. var options = new ApiOptions
  447. {
  448. PageSize = 1,
  449. PageCount = 1,
  450. StartPage = 4
  451. };
  452. var retrieved = await _issuesClient.GetAllForRepository(_context.Repository.Id, request, options);
  453. Assert.Equal(1, retrieved.Count);
  454. Assert.True(retrieved.Any(i => i.Number == issue4.Number));
  455. }
  456. [IntegrationTest]
  457. public async Task CanRetrieveAllIssues()
  458. {
  459. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  460. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  461. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  462. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  463. var issue1 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  464. var issue2 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  465. var issue3 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue3);
  466. var issue4 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue4);
  467. await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, issue4.Number, new IssueUpdate { State = ItemState.Closed });
  468. var request = new RepositoryIssueRequest { State = ItemStateFilter.All };
  469. var retrieved = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName, request);
  470. Assert.Equal(4, retrieved.Count);
  471. Assert.True(retrieved.Any(i => i.Number == issue1.Number));
  472. Assert.True(retrieved.Any(i => i.Number == issue2.Number));
  473. Assert.True(retrieved.Any(i => i.Number == issue3.Number));
  474. Assert.True(retrieved.Any(i => i.Number == issue4.Number));
  475. }
  476. [IntegrationTest]
  477. public async Task CanRetrieveAllIssuesReturnsDistinctReulstsBasedOnApiOptions()
  478. {
  479. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  480. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  481. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  482. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  483. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  484. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  485. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue3);
  486. var issue4 = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue4);
  487. await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, issue4.Number, new IssueUpdate { State = ItemState.Closed });
  488. var request = new RepositoryIssueRequest { State = ItemStateFilter.All };
  489. var firstOptions = new ApiOptions
  490. {
  491. PageSize = 2,
  492. PageCount = 1,
  493. StartPage = 1
  494. };
  495. var firstPage = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName, request, firstOptions);
  496. var secondOptions = new ApiOptions
  497. {
  498. PageSize = 2,
  499. PageCount = 1,
  500. StartPage = 2
  501. };
  502. var secondPage = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName, request, secondOptions);
  503. Assert.Equal(2, firstPage.Count);
  504. Assert.Equal(2, secondPage.Count);
  505. Assert.NotEqual(firstPage[0].Number, secondPage[0].Number);
  506. Assert.NotEqual(firstPage[1].Number, secondPage[1].Number);
  507. }
  508. [IntegrationTest]
  509. public async Task CanRetrieveAllIssuesWithRepositoryId()
  510. {
  511. var newIssue1 = new NewIssue("A test issue1") { Body = "A new unassigned issue" };
  512. var newIssue2 = new NewIssue("A test issue2") { Body = "A new unassigned issue" };
  513. var newIssue3 = new NewIssue("A test issue3") { Body = "A new unassigned issue" };
  514. var newIssue4 = new NewIssue("A test issue4") { Body = "A new unassigned issue" };
  515. var issue1 = await _issuesClient.Create(_context.Repository.Id, newIssue1);
  516. var issue2 = await _issuesClient.Create(_context.Repository.Id, newIssue2);
  517. var issue3 = await _issuesClient.Create(_context.Repository.Id, newIssue3);
  518. var issue4 = await _issuesClient.Create(_context.Repository.Id, newIssue4);
  519. await _issuesClient.Update(_context.Repository.Id, issue4.Number, new IssueUpdate { State = ItemState.Closed });
  520. var request = new RepositoryIssueRequest { State = ItemStateFilter.All };
  521. var retrieved = await _issuesClient.GetAllForRepository(_context.Repository.Id, request);
  522. Assert.Equal(4, retrieved.Count);
  523. Assert.True(retrieved.Any(i => i.Number == issue1.Number));
  524. Assert.True(retrieved.Any(i => i.Number == issue2.Number));
  525. Assert.True(retrieved.Any(i => i.Number == issue3.Number));
  526. Assert.True(retrieved.Any(i => i.Number == issue4.Number));
  527. }
  528. [IntegrationTest]
  529. public async Task CanFilterByAssigned()
  530. {
  531. var newIssue1 = new NewIssue("An assigned issue") { Body = "Assigning this to myself", Assignee = _context.RepositoryOwner };
  532. var newIssue2 = new NewIssue("An unassigned issue") { Body = "A new unassigned issue" };
  533. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  534. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  535. var allIssues = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  536. new RepositoryIssueRequest());
  537. Assert.Equal(2, allIssues.Count);
  538. var assignedIssues = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  539. new RepositoryIssueRequest { Assignee = _context.RepositoryOwner });
  540. Assert.Equal(1, assignedIssues.Count);
  541. Assert.Equal("An assigned issue", assignedIssues[0].Title);
  542. var unassignedIssues = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  543. new RepositoryIssueRequest { Assignee = "none" });
  544. Assert.Equal(1, unassignedIssues.Count);
  545. Assert.Equal("An unassigned issue", unassignedIssues[0].Title);
  546. }
  547. [IntegrationTest]
  548. public async Task CanFilterByAssignedWithRepositoryId()
  549. {
  550. var newIssue1 = new NewIssue("An assigned issue") { Body = "Assigning this to myself", Assignee = _context.RepositoryOwner };
  551. var newIssue2 = new NewIssue("An unassigned issue") { Body = "A new unassigned issue" };
  552. await _issuesClient.Create(_context.Repository.Id, newIssue1);
  553. await _issuesClient.Create(_context.Repository.Id, newIssue2);
  554. var allIssues = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  555. new RepositoryIssueRequest());
  556. Assert.Equal(2, allIssues.Count);
  557. var assignedIssues = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  558. new RepositoryIssueRequest { Assignee = _context.RepositoryOwner });
  559. Assert.Equal(1, assignedIssues.Count);
  560. Assert.Equal("An assigned issue", assignedIssues[0].Title);
  561. var unassignedIssues = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  562. new RepositoryIssueRequest { Assignee = "none" });
  563. Assert.Equal(1, unassignedIssues.Count);
  564. Assert.Equal("An unassigned issue", unassignedIssues[0].Title);
  565. }
  566. [IntegrationTest]
  567. public async Task CanFilterByCreator()
  568. {
  569. var newIssue1 = new NewIssue("An issue") { Body = "words words words" };
  570. var newIssue2 = new NewIssue("Another issue") { Body = "some other words" };
  571. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  572. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  573. var allIssues = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  574. new RepositoryIssueRequest());
  575. Assert.Equal(2, allIssues.Count);
  576. var issuesCreatedByOwner = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  577. new RepositoryIssueRequest { Creator = _context.RepositoryOwner });
  578. Assert.Equal(2, issuesCreatedByOwner.Count);
  579. var issuesCreatedByExternalUser = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  580. new RepositoryIssueRequest { Creator = "shiftkey" });
  581. Assert.Equal(0, issuesCreatedByExternalUser.Count);
  582. }
  583. [IntegrationTest]
  584. public async Task CanFilterByCreatorWithRepositoryId()
  585. {
  586. var newIssue1 = new NewIssue("An issue") { Body = "words words words" };
  587. var newIssue2 = new NewIssue("Another issue") { Body = "some other words" };
  588. await _issuesClient.Create(_context.Repository.Id, newIssue1);
  589. await _issuesClient.Create(_context.Repository.Id, newIssue2);
  590. var allIssues = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  591. new RepositoryIssueRequest());
  592. Assert.Equal(2, allIssues.Count);
  593. var issuesCreatedByOwner = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  594. new RepositoryIssueRequest { Creator = _context.RepositoryOwner });
  595. Assert.Equal(2, issuesCreatedByOwner.Count);
  596. var issuesCreatedByExternalUser = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  597. new RepositoryIssueRequest { Creator = "shiftkey" });
  598. Assert.Equal(0, issuesCreatedByExternalUser.Count);
  599. }
  600. [IntegrationTest]
  601. public async Task CanFilterByMentioned()
  602. {
  603. var newIssue1 = new NewIssue("An issue") { Body = "words words words hello there @shiftkey" };
  604. var newIssue2 = new NewIssue("Another issue") { Body = "some other words" };
  605. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  606. await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue2);
  607. var allIssues = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  608. new RepositoryIssueRequest());
  609. Assert.Equal(2, allIssues.Count);
  610. var mentionsWithShiftkey = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  611. new RepositoryIssueRequest { Mentioned = "shiftkey" });
  612. Assert.Equal(1, mentionsWithShiftkey.Count);
  613. var mentionsWithHaacked = await _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  614. new RepositoryIssueRequest { Mentioned = "haacked" });
  615. Assert.Equal(0, mentionsWithHaacked.Count);
  616. }
  617. [IntegrationTest]
  618. public async Task CanFilterByMentionedWithRepositoryId()
  619. {
  620. var newIssue1 = new NewIssue("An issue") { Body = "words words words hello there @shiftkey" };
  621. var newIssue2 = new NewIssue("Another issue") { Body = "some other words" };
  622. await _issuesClient.Create(_context.Repository.Id, newIssue1);
  623. await _issuesClient.Create(_context.Repository.Id, newIssue2);
  624. var allIssues = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  625. new RepositoryIssueRequest());
  626. Assert.Equal(2, allIssues.Count);
  627. var mentionsWithShiftkey = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  628. new RepositoryIssueRequest { Mentioned = "shiftkey" });
  629. Assert.Equal(1, mentionsWithShiftkey.Count);
  630. var mentionsWithHaacked = await _issuesClient.GetAllForRepository(_context.Repository.Id,
  631. new RepositoryIssueRequest { Mentioned = "haacked" });
  632. Assert.Equal(0, mentionsWithHaacked.Count);
  633. }
  634. [IntegrationTest]
  635. public async Task FilteringByInvalidAccountThrowsError()
  636. {
  637. await Assert.ThrowsAsync<ApiValidationException>(
  638. () => _issuesClient.GetAllForRepository(_context.RepositoryOwner, _context.RepositoryName,
  639. new RepositoryIssueRequest { Assignee = "some-random-account" }));
  640. }
  641. [IntegrationTest]
  642. public async Task FilteringByInvalidAccountThrowsErrorWithRepositoryId()
  643. {
  644. await Assert.ThrowsAsync<ApiValidationException>(
  645. () => _issuesClient.GetAllForRepository(_context.Repository.Id,
  646. new RepositoryIssueRequest { Assignee = "some-random-account" }));
  647. }
  648. [IntegrationTest]
  649. public async Task CanAssignAndUnassignMilestone()
  650. {
  651. var newMilestone = new NewMilestone("a milestone");
  652. var milestone = await _issuesClient.Milestone.Create(_context.RepositoryOwner, _context.RepositoryName, newMilestone);
  653. var newIssue1 = new NewIssue("A test issue1")
  654. {
  655. Body = "A new unassigned issue",
  656. Milestone = milestone.Number
  657. };
  658. var issue = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue1);
  659. Assert.NotNull(issue.Milestone);
  660. var issueUpdate = issue.ToUpdate();
  661. issueUpdate.Milestone = null;
  662. var updatedIssue = await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, issue.Number, issueUpdate);
  663. Assert.Null(updatedIssue.Milestone);
  664. }
  665. [IntegrationTest]
  666. public async Task CanAssignAndUnassignMilestoneWithRepositoryId()
  667. {
  668. var newMilestone = new NewMilestone("a milestone");
  669. var milestone = await _issuesClient.Milestone.Create(_context.RepositoryOwner, _context.RepositoryName, newMilestone);
  670. var newIssue1 = new NewIssue("A test issue1")
  671. {
  672. Body = "A new unassigned issue",
  673. Milestone = milestone.Number
  674. };
  675. var issue = await _issuesClient.Create(_context.Repository.Id, newIssue1);
  676. Assert.NotNull(issue.Milestone);
  677. var issueUpdate = issue.ToUpdate();
  678. issueUpdate.Milestone = null;
  679. var updatedIssue = await _issuesClient.Update(_context.Repository.Id, issue.Number, issueUpdate);
  680. Assert.Null(updatedIssue.Milestone);
  681. }
  682. [IntegrationTest]
  683. public async Task DoesNotChangeLabelsByDefault()
  684. {
  685. await _issuesClient.Labels.Create(_context.RepositoryOwner, _context.RepositoryName, new NewLabel("something", "FF0000"));
  686. var newIssue = new NewIssue("A test issue1")
  687. {
  688. Body = "A new unassigned issue"
  689. };
  690. newIssue.Labels.Add("something");
  691. var issue = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue);
  692. var issueUpdate = issue.ToUpdate();
  693. var updatedIssue = await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, issue.Number, issueUpdate);
  694. Assert.Equal(1, updatedIssue.Labels.Count);
  695. }
  696. [IntegrationTest]
  697. public async Task DoesNotChangeLabelsByDefaultWithRepositoryId()
  698. {
  699. await _issuesClient.Labels.Create(_context.RepositoryOwner, _context.RepositoryName, new NewLabel("something", "FF0000"));
  700. var newIssue = new NewIssue("A test issue1")
  701. {
  702. Body = "A new unassigned issue"
  703. };
  704. newIssue.Labels.Add("something");
  705. var issue = await _issuesClient.Create(_context.Repository.Id, newIssue);
  706. var issueUpdate = issue.ToUpdate();
  707. var updatedIssue = await _issuesClient.Update(_context.Repository.Id, issue.Number, issueUpdate);
  708. Assert.Equal(1, updatedIssue.Labels.Count);
  709. }
  710. [IntegrationTest]
  711. public async Task CanUpdateLabelForAnIssue()
  712. {
  713. // create some labels
  714. await _issuesClient.Labels.Create(_context.RepositoryOwner, _context.RepositoryName, new NewLabel("something", "FF0000"));
  715. await _issuesClient.Labels.Create(_context.RepositoryOwner, _context.RepositoryName, new NewLabel("another thing", "0000FF"));
  716. // setup us the issue
  717. var newIssue = new NewIssue("A test issue1")
  718. {
  719. Body = "A new unassigned issue"
  720. };
  721. newIssue.Labels.Add("something");
  722. var issue = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue);
  723. // update the issue
  724. var issueUpdate = issue.ToUpdate();
  725. issueUpdate.AddLabel("another thing");
  726. var updatedIssue = await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, issue.Number, issueUpdate);
  727. Assert.Equal("another thing", updatedIssue.Labels[0].Name);
  728. }
  729. [IntegrationTest]
  730. public async Task CanUpdateLabelForAnIssueWithRepositoryId()
  731. {
  732. // create some labels
  733. await _issuesClient.Labels.Create(_context.RepositoryOwner, _context.RepositoryName, new NewLabel("something", "FF0000"));
  734. await _issuesClient.Labels.Create(_context.RepositoryOwner, _context.RepositoryName, new NewLabel("another thing", "0000FF"));
  735. // setup us the issue
  736. var newIssue = new NewIssue("A test issue1")
  737. {
  738. Body = "A new unassigned issue"
  739. };
  740. newIssue.Labels.Add("something");
  741. var issue = await _issuesClient.Create(_context.Repository.Id, newIssue);
  742. // update the issue
  743. var issueUpdate = issue.ToUpdate();
  744. issueUpdate.AddLabel("another thing");
  745. var updatedIssue = await _issuesClient.Update(_context.Repository.Id, issue.Number, issueUpdate);
  746. Assert.Equal("another thing", updatedIssue.Labels[0].Name);
  747. }
  748. [IntegrationTest]
  749. public async Task CanClearLabelsForAnIssue()
  750. {
  751. // create some labels
  752. await _issuesClient.Labels.Create(_context.RepositoryOwner, _context.RepositoryName, new NewLabel("something", "FF0000"));
  753. await _issuesClient.Labels.Create(_context.RepositoryOwner, _context.RepositoryName, new NewLabel("another thing", "0000FF"));
  754. // setup us the issue
  755. var newIssue = new NewIssue("A test issue1")
  756. {
  757. Body = "A new unassigned issue"
  758. };
  759. newIssue.Labels.Add("something");
  760. newIssue.Labels.Add("another thing");
  761. var issue = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue);
  762. Assert.Equal(2, issue.Labels.Count);
  763. // update the issue
  764. var issueUpdate = issue.ToUpdate();
  765. issueUpdate.ClearLabels();
  766. var updatedIssue = await _issuesClient.Update(_context.RepositoryOwner, _context.RepositoryName, issue.Number, issueUpdate);
  767. Assert.Empty(updatedIssue.Labels);
  768. }
  769. [IntegrationTest]
  770. public async Task CanClearLabelsForAnIssueWithRepositoryId()
  771. {
  772. // create some labels
  773. await _issuesClient.Labels.Create(_context.RepositoryOwner, _context.RepositoryName, new NewLabel("something", "FF0000"));
  774. await _issuesClient.Labels.Create(_context.RepositoryOwner, _context.RepositoryName, new NewLabel("another thing", "0000FF"));
  775. // setup us the issue
  776. var newIssue = new NewIssue("A test issue1")
  777. {
  778. Body = "A new unassigned issue"
  779. };
  780. newIssue.Labels.Add("something");
  781. newIssue.Labels.Add("another thing");
  782. var issue = await _issuesClient.Create(_context.Repository.Id, newIssue);
  783. Assert.Equal(2, issue.Labels.Count);
  784. // update the issue
  785. var issueUpdate = issue.ToUpdate();
  786. issueUpdate.ClearLabels();
  787. var updatedIssue = await _issuesClient.Update(_context.Repository.Id, issue.Number, issueUpdate);
  788. Assert.Empty(updatedIssue.Labels);
  789. }
  790. [IntegrationTest]
  791. public async Task CanAccessUrls()
  792. {
  793. var expectedUri = "https://api.github.com/repos/{0}/{1}/issues/{2}/{3}";
  794. var newIssue = new NewIssue("A test issue")
  795. {
  796. Body = "A new unassigned issue"
  797. };
  798. var issue = await _issuesClient.Create(_context.RepositoryOwner, _context.RepositoryName, newIssue);
  799. Assert.NotNull(issue.CommentsUrl);
  800. Assert.Equal(new Uri(string.Format(expectedUri, _context.RepositoryOwner, _context.RepositoryName, issue.Number, "comments")), issue.CommentsUrl);
  801. Assert.NotNull(issue.EventsUrl);
  802. Assert.Equal(new Uri(string.Format(expectedUri, _context.RepositoryOwner, _context.RepositoryName, issue.Number, "events")), issue.EventsUrl);
  803. }
  804. [IntegrationTest]
  805. public async Task CanAccessUrlsWithRepositoryId()
  806. {
  807. var expectedUri = "https://api.github.com/repos/{0}/{1}/issues/{2}/{3}";
  808. var newIssue = new NewIssue("A test issue")
  809. {
  810. Body = "A new unassigned issue"
  811. };
  812. var issue = await _issuesClient.Create(_context.Repository.Id, newIssue);
  813. Assert.NotNull(issue.CommentsUrl);
  814. Assert.Equal(new Uri(string.Format(expectedUri, _context.RepositoryOwner, _context.RepositoryName, issue.Number, "comments")), issue.CommentsUrl);
  815. Assert.NotNull(issue.EventsUrl);
  816. Assert.Equal(new Uri(string.Format(expectedUri, _context.RepositoryOwner, _context.RepositoryName, issue.Number, "events")), issue.EventsUrl);
  817. }
  818. [IntegrationTest]
  819. public async Task GetAllForCurrentContainsRepositoryData()
  820. {
  821. var issuesForCurrentUser = await _issuesClient.GetAllForCurrent();
  822. foreach (var issue in issuesForCurrentUser)
  823. {
  824. Assert.Equal(Helper.UserName, issue.User.Login);
  825. Assert.NotNull(issue.Repository);
  826. }
  827. }
  828. [IntegrationTest]
  829. public async Task GetAllForOwnedAndMemberRepositoriesContainsRepositoryData()
  830. {
  831. var issuesForOwnedAndMemberRepositories = await _issuesClient.GetAllForOwnedAndMemberRepositories();
  832. foreach (var issue in issuesForOwnedAndMemberRepositories)
  833. {
  834. Assert.NotNull(issue.Repository);
  835. }
  836. }
  837. [IntegrationTest]
  838. public async Task GetAllForOrganizationContainsRepositoryData()
  839. {
  840. var issuesForOrganization = await _issuesClient.GetAllForOrganization(Helper.Organization);
  841. foreach (var issue in issuesForOrganization)
  842. {
  843. Assert.NotNull(issue.Repository);
  844. }
  845. }
  846. [IntegrationTest]
  847. public async Task CanGetReactionPayload()
  848. {
  849. using (var context = await _github.CreateRepositoryContext(Helper.MakeNameWithTimestamp("IssuesReactionTests")))
  850. {
  851. // Create a test issue with reactions
  852. var issueNumber = await HelperCreateIssue(context.RepositoryOwner, context.RepositoryName);
  853. // Retrieve the issue
  854. var retrieved = await _issuesClient.Get(context.RepositoryOwner, context.RepositoryName, issueNumber);
  855. // Check the reactions
  856. Assert.True(retrieved.Id > 0);
  857. Assert.Equal(6, retrieved.Reactions.TotalCount);
  858. Assert.Equal(1, retrieved.Reactions.Plus1);
  859. Assert.Equal(1, retrieved.Reactions.Hooray);
  860. Assert.Equal(1, retrieved.Reactions.Heart);
  861. Assert.Equal(1, retrieved.Reactions.Laugh);
  862. Assert.Equal(1, retrieved.Reactions.Confused);
  863. Assert.Equal(1, retrieved.Reactions.Minus1);
  864. }
  865. }
  866. [IntegrationTest]
  867. public async Task CanGetReactionPayloadForMultipleIssues()
  868. {
  869. var numberToCreate = 2;
  870. using (var context = await _github.CreateRepositoryContext(Helper.MakeNameWithTimestamp("IssuesReactionTests")))
  871. {
  872. var issueNumbers = new List<int>();
  873. // Create multiple test issues with reactions
  874. for (int count = 1; count <= numberToCreate; count++)
  875. {
  876. var issueNumber = await HelperCreateIssue(context.RepositoryOwner, context.RepositoryName);
  877. issueNumbers.Add(issueNumber);
  878. }
  879. Assert.Equal(numberToCreate, issueNumbers.Count);
  880. // Retrieve all issues for the repo
  881. var issues = await _issuesClient.GetAllForRepository(context.RepositoryOwner, context.RepositoryName);
  882. // Check the reactions
  883. foreach (var issueNumber in issueNumbers)
  884. {
  885. var retrieved = issues.FirstOrDefault(x => x.Number == issueNumber);
  886. Assert.NotNull(retrieved);
  887. Assert.Equal(6, retrieved.Reactions.TotalCount);
  888. Assert.Equal(1, retrieved.Reactions.Plus1);
  889. Assert.Equal(1, retrieved.Reactions.Hooray);
  890. Assert.Equal(1, retrieved.Reactions.Heart);
  891. Assert.Equal(1, retrieved.Reactions.Laugh);
  892. Assert.Equal(1, retrieved.Reactions.Confused);
  893. Assert.Equal(1, retrieved.Reactions.Minus1);
  894. }
  895. }
  896. }
  897. async static Task<int> HelperCreateIssue(string owner, string repo)
  898. {
  899. var github = Helper.GetAuthenticatedClient();
  900. var newIssue = new NewIssue("A test issue") { Body = "A new unassigned issue" };
  901. var issue = await github.Issue.Create(owner, repo, newIssue);
  902. Assert.NotNull(issue);
  903. foreach (ReactionType reactionType in Enum.GetValues(typeof(ReactionType)))
  904. {
  905. var newReaction = new NewReaction(reactionType);
  906. var reaction = await github.Reaction.Issue.Create(owner, repo, issue.Number, newReaction)