PageRenderTime 49ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/Octokit.Tests/Reactive/ObservablePullRequestsClientTests.cs

https://gitlab.com/WoomyNightClub/GitHub-API-.NET
C# | 771 lines | 653 code | 118 blank | 0 comment | 66 complexity | 6c85e3dcdc176cda4f2be383d3a55bc2 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reactive.Linq;
  5. using System.Reactive.Threading.Tasks;
  6. using System.Threading.Tasks;
  7. using NSubstitute;
  8. using Octokit.Internal;
  9. using Octokit.Reactive;
  10. using Xunit;
  11. namespace Octokit.Tests.Reactive
  12. {
  13. public class ObservablePullRequestsClientTests
  14. {
  15. public class TheGetMethod
  16. {
  17. [Fact]
  18. public void RequestsCorrectUrl()
  19. {
  20. var gitHubClient = Substitute.For<IGitHubClient>();
  21. var client = new ObservablePullRequestsClient(gitHubClient);
  22. client.Get("fake", "repo", 42);
  23. gitHubClient.Repository.PullRequest.Received().Get("fake", "repo", 42);
  24. }
  25. [Fact]
  26. public void RequestsCorrectUrlWithRepositoryId()
  27. {
  28. var gitHubClient = Substitute.For<IGitHubClient>();
  29. var client = new ObservablePullRequestsClient(gitHubClient);
  30. client.Get(1, 42);
  31. gitHubClient.Repository.PullRequest.Received().Get(1, 42);
  32. }
  33. [Fact]
  34. public async Task EnsuresNonNullArguments()
  35. {
  36. var client = new ObservablePullRequestsClient(Substitute.For<IGitHubClient>());
  37. Assert.Throws<ArgumentNullException>(() => client.Get(null, "name", 1));
  38. Assert.Throws<ArgumentNullException>(() => client.Get("owner", null, 1));
  39. Assert.Throws<ArgumentException>(() => client.Get("", "name", 1));
  40. Assert.Throws<ArgumentException>(() => client.Get("owner", "", 1));
  41. }
  42. }
  43. public class TheGetForRepositoryMethod
  44. {
  45. [Fact]
  46. public void RequestsCorrectUrl()
  47. {
  48. var gitHubClient = Substitute.For<IGitHubClient>();
  49. var client = new ObservablePullRequestsClient(gitHubClient);
  50. client.GetAllForRepository("fake", "repo");
  51. gitHubClient.Received().PullRequest.GetAllForRepository("fake", "repo");
  52. }
  53. [Fact]
  54. public void RequestsCorrectUrlWithRepositoryId()
  55. {
  56. var gitHubClient = Substitute.For<IGitHubClient>();
  57. var client = new ObservablePullRequestsClient(gitHubClient);
  58. client.GetAllForRepository(1);
  59. gitHubClient.Received().PullRequest.GetAllForRepository(1);
  60. }
  61. [Fact]
  62. public void RequestsCorrectUrlWithApiOptions()
  63. {
  64. var gitHubClient = Substitute.For<IGitHubClient>();
  65. var client = new ObservablePullRequestsClient(gitHubClient);
  66. var options = new ApiOptions
  67. {
  68. PageCount = 1,
  69. PageSize = 1,
  70. StartPage = 1
  71. };
  72. client.GetAllForRepository("fake", "repo", options);
  73. gitHubClient.Received().PullRequest.GetAllForRepository("fake", "repo", options);
  74. }
  75. [Fact]
  76. public void RequestsCorrectUrlWithApiOptionsWithRepositoryId()
  77. {
  78. var gitHubClient = Substitute.For<IGitHubClient>();
  79. var client = new ObservablePullRequestsClient(gitHubClient);
  80. var options = new ApiOptions
  81. {
  82. PageCount = 1,
  83. PageSize = 1,
  84. StartPage = 1
  85. };
  86. client.GetAllForRepository(1, options);
  87. gitHubClient.Received().PullRequest.GetAllForRepository(1, options);
  88. }
  89. [Fact]
  90. public void SendsAppropriateParameters()
  91. {
  92. var gitHubClient = Substitute.For<IGitHubClient>();
  93. var client = new ObservablePullRequestsClient(gitHubClient);
  94. var pullRequestRequest = new PullRequestRequest { SortDirection = SortDirection.Descending };
  95. client.GetAllForRepository("fake", "repo", pullRequestRequest);
  96. gitHubClient.Received().PullRequest.GetAllForRepository("fake", "repo", pullRequestRequest, Args.ApiOptions);
  97. }
  98. [Fact]
  99. public void SendsAppropriateParametersWithRepositoryId()
  100. {
  101. var gitHubClient = Substitute.For<IGitHubClient>();
  102. var client = new ObservablePullRequestsClient(gitHubClient);
  103. var pullRequestRequest = new PullRequestRequest { SortDirection = SortDirection.Descending };
  104. client.GetAllForRepository(1, pullRequestRequest);
  105. gitHubClient.Received().PullRequest.GetAllForRepository(1, pullRequestRequest, Args.ApiOptions);
  106. }
  107. [Fact]
  108. public void SendsAppropriateParametersWithApiOptions()
  109. {
  110. var gitHubClient = Substitute.For<IGitHubClient>();
  111. var client = new ObservablePullRequestsClient(gitHubClient);
  112. var options = new ApiOptions
  113. {
  114. PageCount = 1,
  115. PageSize = 1,
  116. StartPage = 1
  117. };
  118. var pullRequestRequest = new PullRequestRequest { SortDirection = SortDirection.Descending };
  119. client.GetAllForRepository("fake", "repo", pullRequestRequest, options);
  120. gitHubClient.Received().PullRequest.GetAllForRepository("fake", "repo", pullRequestRequest, options);
  121. }
  122. [Fact]
  123. public void SendsAppropriateParametersWithApiOptionsWithRepositoryId()
  124. {
  125. var gitHubClient = Substitute.For<IGitHubClient>();
  126. var client = new ObservablePullRequestsClient(gitHubClient);
  127. var options = new ApiOptions
  128. {
  129. PageCount = 1,
  130. PageSize = 1,
  131. StartPage = 1
  132. };
  133. var pullRequestRequest = new PullRequestRequest { SortDirection = SortDirection.Descending };
  134. client.GetAllForRepository(1, pullRequestRequest, options);
  135. gitHubClient.Received().PullRequest.GetAllForRepository(1, pullRequestRequest, options);
  136. }
  137. [Fact]
  138. public async Task ReturnsEveryPageOfPullRequests()
  139. {
  140. var firstPageUrl = new Uri("repos/fake/repo/pulls", UriKind.Relative);
  141. var secondPageUrl = new Uri("https://example.com/page/2");
  142. var firstPageLinks = new Dictionary<string, Uri> { { "next", secondPageUrl } };
  143. var firstPageResponse = new ApiResponse<List<PullRequest>>
  144. (
  145. CreateResponseWithApiInfo(firstPageLinks),
  146. new List<PullRequest>
  147. {
  148. new PullRequest(1),
  149. new PullRequest(2),
  150. new PullRequest(3)
  151. }
  152. );
  153. var thirdPageUrl = new Uri("https://example.com/page/3");
  154. var secondPageLinks = new Dictionary<string, Uri> { { "next", thirdPageUrl } };
  155. var secondPageResponse = new ApiResponse<List<PullRequest>>
  156. (
  157. CreateResponseWithApiInfo(secondPageLinks),
  158. new List<PullRequest>
  159. {
  160. new PullRequest(4),
  161. new PullRequest(5),
  162. new PullRequest(6)
  163. }
  164. );
  165. var lastPageResponse = new ApiResponse<List<PullRequest>>
  166. (
  167. new Response(),
  168. new List<PullRequest>
  169. {
  170. new PullRequest(7)
  171. }
  172. );
  173. var gitHubClient = Substitute.For<IGitHubClient>();
  174. gitHubClient.Connection.Get<List<PullRequest>>(firstPageUrl, Args.EmptyDictionary, null)
  175. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => firstPageResponse));
  176. gitHubClient.Connection.Get<List<PullRequest>>(secondPageUrl, Args.EmptyDictionary, null)
  177. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => secondPageResponse));
  178. gitHubClient.Connection.Get<List<PullRequest>>(thirdPageUrl, Args.EmptyDictionary, null)
  179. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => lastPageResponse));
  180. var client = new ObservablePullRequestsClient(gitHubClient);
  181. var results = await client.GetAllForRepository("fake", "repo").ToArray();
  182. Assert.Equal(7, results.Length);
  183. Assert.Equal(firstPageResponse.Body[0].Number, results[0].Number);
  184. Assert.Equal(secondPageResponse.Body[1].Number, results[4].Number);
  185. Assert.Equal(lastPageResponse.Body[0].Number, results[6].Number);
  186. }
  187. [Fact]
  188. public async Task ReturnsEveryPageOfPullRequestsWithRepositoryId()
  189. {
  190. var firstPageUrl = new Uri("repositories/1/pulls", UriKind.Relative);
  191. var secondPageUrl = new Uri("https://example.com/page/2");
  192. var firstPageLinks = new Dictionary<string, Uri> { { "next", secondPageUrl } };
  193. var firstPageResponse = new ApiResponse<List<PullRequest>>
  194. (
  195. CreateResponseWithApiInfo(firstPageLinks),
  196. new List<PullRequest>
  197. {
  198. new PullRequest(1),
  199. new PullRequest(2),
  200. new PullRequest(3)
  201. }
  202. );
  203. var thirdPageUrl = new Uri("https://example.com/page/3");
  204. var secondPageLinks = new Dictionary<string, Uri> { { "next", thirdPageUrl } };
  205. var secondPageResponse = new ApiResponse<List<PullRequest>>
  206. (
  207. CreateResponseWithApiInfo(secondPageLinks),
  208. new List<PullRequest>
  209. {
  210. new PullRequest(4),
  211. new PullRequest(5),
  212. new PullRequest(6)
  213. }
  214. );
  215. var lastPageResponse = new ApiResponse<List<PullRequest>>
  216. (
  217. new Response(),
  218. new List<PullRequest>
  219. {
  220. new PullRequest(7)
  221. }
  222. );
  223. var gitHubClient = Substitute.For<IGitHubClient>();
  224. gitHubClient.Connection.Get<List<PullRequest>>(firstPageUrl, Args.EmptyDictionary, null)
  225. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => firstPageResponse));
  226. gitHubClient.Connection.Get<List<PullRequest>>(secondPageUrl, Args.EmptyDictionary, null)
  227. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => secondPageResponse));
  228. gitHubClient.Connection.Get<List<PullRequest>>(thirdPageUrl, Args.EmptyDictionary, null)
  229. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => lastPageResponse));
  230. var client = new ObservablePullRequestsClient(gitHubClient);
  231. var results = await client.GetAllForRepository(1).ToArray();
  232. Assert.Equal(7, results.Length);
  233. Assert.Equal(firstPageResponse.Body[0].Number, results[0].Number);
  234. Assert.Equal(secondPageResponse.Body[1].Number, results[4].Number);
  235. Assert.Equal(lastPageResponse.Body[0].Number, results[6].Number);
  236. }
  237. [Fact]
  238. public async Task SendsAppropriateParametersMulti()
  239. {
  240. var firstPageUrl = new Uri("repos/fake/repo/pulls", UriKind.Relative);
  241. var secondPageUrl = new Uri("https://example.com/page/2");
  242. var firstPageLinks = new Dictionary<string, Uri> { { "next", secondPageUrl } };
  243. var firstPageResponse = new ApiResponse<List<PullRequest>>
  244. (
  245. CreateResponseWithApiInfo(firstPageLinks),
  246. new List<PullRequest>
  247. {
  248. new PullRequest(1),
  249. new PullRequest(2),
  250. new PullRequest(3)
  251. }
  252. );
  253. var thirdPageUrl = new Uri("https://example.com/page/3");
  254. var secondPageLinks = new Dictionary<string, Uri> { { "next", thirdPageUrl } };
  255. var secondPageResponse = new ApiResponse<List<PullRequest>>
  256. (
  257. CreateResponseWithApiInfo(secondPageLinks),
  258. new List<PullRequest>
  259. {
  260. new PullRequest(4),
  261. new PullRequest(5),
  262. new PullRequest(6)
  263. }
  264. );
  265. var lastPageResponse = new ApiResponse<List<PullRequest>>
  266. (
  267. new Response(),
  268. new List<PullRequest>
  269. {
  270. new PullRequest(7)
  271. }
  272. );
  273. var gitHubClient = Substitute.For<IGitHubClient>();
  274. gitHubClient.Connection.Get<List<PullRequest>>(Arg.Is(firstPageUrl),
  275. Arg.Is<Dictionary<string, string>>(d => d.Count == 5
  276. && d["head"] == "user:ref-name"
  277. && d["state"] == "open"
  278. && d["base"] == "fake_base_branch"
  279. && d["sort"] == "created"
  280. && d["direction"] == "desc"), Arg.Any<string>())
  281. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => firstPageResponse));
  282. gitHubClient.Connection.Get<List<PullRequest>>(secondPageUrl, Arg.Is<Dictionary<string, string>>(d => d.Count == 5
  283. && d["head"] == "user:ref-name"
  284. && d["state"] == "open"
  285. && d["base"] == "fake_base_branch"
  286. && d["sort"] == "created"
  287. && d["direction"] == "desc"), null)
  288. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => secondPageResponse));
  289. gitHubClient.Connection.Get<List<PullRequest>>(thirdPageUrl, Arg.Is<Dictionary<string, string>>(d => d.Count == 5
  290. && d["head"] == "user:ref-name"
  291. && d["state"] == "open"
  292. && d["base"] == "fake_base_branch"
  293. && d["sort"] == "created"
  294. && d["direction"] == "desc"), null)
  295. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => lastPageResponse));
  296. var client = new ObservablePullRequestsClient(gitHubClient);
  297. var results = await client.GetAllForRepository("fake", "repo", new PullRequestRequest { Head = "user:ref-name", Base = "fake_base_branch" }).ToArray();
  298. Assert.Equal(7, results.Length);
  299. Assert.Equal(firstPageResponse.Body[0].Number, results[0].Number);
  300. Assert.Equal(secondPageResponse.Body[1].Number, results[4].Number);
  301. Assert.Equal(lastPageResponse.Body[0].Number, results[6].Number);
  302. }
  303. [Fact]
  304. public async Task SendsAppropriateParametersMultiWithRepositoryId()
  305. {
  306. var firstPageUrl = new Uri("repositories/1/pulls", UriKind.Relative);
  307. var secondPageUrl = new Uri("https://example.com/page/2");
  308. var firstPageLinks = new Dictionary<string, Uri> { { "next", secondPageUrl } };
  309. var firstPageResponse = new ApiResponse<List<PullRequest>>
  310. (
  311. CreateResponseWithApiInfo(firstPageLinks),
  312. new List<PullRequest>
  313. {
  314. new PullRequest(1),
  315. new PullRequest(2),
  316. new PullRequest(3)
  317. }
  318. );
  319. var thirdPageUrl = new Uri("https://example.com/page/3");
  320. var secondPageLinks = new Dictionary<string, Uri> { { "next", thirdPageUrl } };
  321. var secondPageResponse = new ApiResponse<List<PullRequest>>
  322. (
  323. CreateResponseWithApiInfo(secondPageLinks),
  324. new List<PullRequest>
  325. {
  326. new PullRequest(4),
  327. new PullRequest(5),
  328. new PullRequest(6)
  329. }
  330. );
  331. var lastPageResponse = new ApiResponse<List<PullRequest>>
  332. (
  333. new Response(),
  334. new List<PullRequest>
  335. {
  336. new PullRequest(7)
  337. }
  338. );
  339. var gitHubClient = Substitute.For<IGitHubClient>();
  340. gitHubClient.Connection.Get<List<PullRequest>>(Arg.Is(firstPageUrl),
  341. Arg.Is<Dictionary<string, string>>(d => d.Count == 5
  342. && d["head"] == "user:ref-name"
  343. && d["state"] == "open"
  344. && d["base"] == "fake_base_branch"
  345. && d["sort"] == "created"
  346. && d["direction"] == "desc"), Arg.Any<string>())
  347. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => firstPageResponse));
  348. gitHubClient.Connection.Get<List<PullRequest>>(secondPageUrl, Arg.Is<Dictionary<string, string>>(d => d.Count == 5
  349. && d["head"] == "user:ref-name"
  350. && d["state"] == "open"
  351. && d["base"] == "fake_base_branch"
  352. && d["sort"] == "created"
  353. && d["direction"] == "desc"), null)
  354. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => secondPageResponse));
  355. gitHubClient.Connection.Get<List<PullRequest>>(thirdPageUrl, Arg.Is<Dictionary<string, string>>(d => d.Count == 5
  356. && d["head"] == "user:ref-name"
  357. && d["state"] == "open"
  358. && d["base"] == "fake_base_branch"
  359. && d["sort"] == "created"
  360. && d["direction"] == "desc"), null)
  361. .Returns(Task.Factory.StartNew<IApiResponse<List<PullRequest>>>(() => lastPageResponse));
  362. var client = new ObservablePullRequestsClient(gitHubClient);
  363. var results = await client.GetAllForRepository(1, new PullRequestRequest { Head = "user:ref-name", Base = "fake_base_branch" }).ToArray();
  364. Assert.Equal(7, results.Length);
  365. Assert.Equal(firstPageResponse.Body[0].Number, results[0].Number);
  366. Assert.Equal(secondPageResponse.Body[1].Number, results[4].Number);
  367. Assert.Equal(lastPageResponse.Body[0].Number, results[6].Number);
  368. }
  369. [Fact]
  370. public async Task EnsuresNonNullArguments()
  371. {
  372. var gitHubClient = Substitute.For<IGitHubClient>();
  373. var client = new ObservablePullRequestsClient(gitHubClient);
  374. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository(null, "name"));
  375. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository("owner", null));
  376. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository(null, "name", ApiOptions.None));
  377. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository("owner", null, ApiOptions.None));
  378. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository("owner", "name", (ApiOptions)null));
  379. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository(null, "name", new PullRequestRequest()));
  380. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository("owner", null, new PullRequestRequest()));
  381. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository("owner", "name", (PullRequestRequest)null));
  382. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository(null, "name", new PullRequestRequest(), ApiOptions.None));
  383. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository("owner", null, new PullRequestRequest(), ApiOptions.None));
  384. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository("owner", "name", null, ApiOptions.None));
  385. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository("owner", "name", new PullRequestRequest(), null));
  386. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository(1, (ApiOptions)null));
  387. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository(1, (PullRequestRequest)null));
  388. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository(1, null, ApiOptions.None));
  389. Assert.Throws<ArgumentNullException>(() => client.GetAllForRepository(1, new PullRequestRequest(), null));
  390. Assert.Throws<ArgumentException>(() => client.GetAllForRepository("", "name"));
  391. Assert.Throws<ArgumentException>(() => client.GetAllForRepository("owner", ""));
  392. Assert.Throws<ArgumentException>(() => client.GetAllForRepository("", "name", ApiOptions.None));
  393. Assert.Throws<ArgumentException>(() => client.GetAllForRepository("owner", "", ApiOptions.None));
  394. Assert.Throws<ArgumentException>(() => client.GetAllForRepository("", "name", new PullRequestRequest()));
  395. Assert.Throws<ArgumentException>(() => client.GetAllForRepository("owner", "", new PullRequestRequest()));
  396. Assert.Throws<ArgumentException>(() => client.GetAllForRepository("", "name", new PullRequestRequest(), ApiOptions.None));
  397. Assert.Throws<ArgumentException>(() => client.GetAllForRepository("owner", "", new PullRequestRequest(), ApiOptions.None));
  398. }
  399. }
  400. public class TheCreateMethod
  401. {
  402. [Fact]
  403. public void CreatesFromClientRepositoryPullRequest()
  404. {
  405. var newPullRequest = new NewPullRequest("some title", "branch:name", "branch:name");
  406. var gitHubClient = Substitute.For<IGitHubClient>();
  407. var client = new ObservablePullRequestsClient(gitHubClient);
  408. client.Create("fake", "repo", newPullRequest);
  409. gitHubClient.Repository.PullRequest.Received().Create("fake", "repo", newPullRequest);
  410. }
  411. [Fact]
  412. public void CreatesFromClientRepositoryPullRequestWithRepositoryId()
  413. {
  414. var newPullRequest = new NewPullRequest("some title", "branch:name", "branch:name");
  415. var gitHubClient = Substitute.For<IGitHubClient>();
  416. var client = new ObservablePullRequestsClient(gitHubClient);
  417. client.Create(1, newPullRequest);
  418. gitHubClient.Repository.PullRequest.Received().Create(1, newPullRequest);
  419. }
  420. [Fact]
  421. public void EnsuresNonNullArguments()
  422. {
  423. var gitHubClient = Substitute.For<IGitHubClient>();
  424. var client = new ObservablePullRequestsClient(gitHubClient);
  425. Assert.Throws<ArgumentNullException>(() => client.Create(null, "name", new NewPullRequest("title", "ref", "ref2")));
  426. Assert.Throws<ArgumentNullException>(() => client.Create("owner", null, new NewPullRequest("title", "ref", "ref2")));
  427. Assert.Throws<ArgumentNullException>(() => client.Create("owner", "name", null));
  428. Assert.Throws<ArgumentNullException>(() => client.Create(1, null));
  429. Assert.Throws<ArgumentException>(() => client.Create("", "name", new NewPullRequest("title", "ref", "ref2")));
  430. Assert.Throws<ArgumentException>(() => client.Create("owner", "", new NewPullRequest("title", "ref", "ref2")));
  431. }
  432. }
  433. public class TheUpdateMethod
  434. {
  435. [Fact]
  436. public void UpdatesClientRepositoryPullRequest()
  437. {
  438. var pullRequestUpdate = new PullRequestUpdate();
  439. var gitHubClient = Substitute.For<IGitHubClient>();
  440. var client = new ObservablePullRequestsClient(gitHubClient);
  441. client.Update("fake", "repo", 42, pullRequestUpdate);
  442. gitHubClient.Repository.PullRequest.Received().Update("fake", "repo", 42, pullRequestUpdate);
  443. }
  444. [Fact]
  445. public void UpdatesClientRepositoryPullRequestWithRepositoryId()
  446. {
  447. var pullRequestUpdate = new PullRequestUpdate();
  448. var gitHubClient = Substitute.For<IGitHubClient>();
  449. var client = new ObservablePullRequestsClient(gitHubClient);
  450. client.Update(1, 42, pullRequestUpdate);
  451. gitHubClient.Repository.PullRequest.Received().Update(1, 42, pullRequestUpdate);
  452. }
  453. [Fact]
  454. public async Task EnsuresNonNullArguments()
  455. {
  456. var gitHubClient = Substitute.For<IGitHubClient>();
  457. var client = new ObservablePullRequestsClient(gitHubClient);
  458. Assert.Throws<ArgumentNullException>(() => client.Update(null, "name", 42, new PullRequestUpdate()));
  459. Assert.Throws<ArgumentNullException>(() => client.Update("owner", null, 42, new PullRequestUpdate()));
  460. Assert.Throws<ArgumentNullException>(() => client.Update("owner", "name", 42, null));
  461. Assert.Throws<ArgumentNullException>(() => client.Update(1, 42, null));
  462. Assert.Throws<ArgumentException>(() => client.Update("", "name", 42, new PullRequestUpdate()));
  463. Assert.Throws<ArgumentException>(() => client.Update("owner", "", 42, new PullRequestUpdate()));
  464. }
  465. }
  466. public class TheMergeMethod
  467. {
  468. [Fact]
  469. public void MergesPullRequest()
  470. {
  471. var mergePullRequest = new MergePullRequest { CommitMessage = "fake commit message" };
  472. var gitHubClient = Substitute.For<IGitHubClient>();
  473. var client = new ObservablePullRequestsClient(gitHubClient);
  474. client.Merge("fake", "repo", 42, mergePullRequest);
  475. gitHubClient.Repository.PullRequest.Received().Merge("fake", "repo", 42, mergePullRequest);
  476. }
  477. [Fact]
  478. public void MergesPullRequestWithRepositoryId()
  479. {
  480. var mergePullRequest = new MergePullRequest { CommitMessage = "fake commit message" };
  481. var gitHubClient = Substitute.For<IGitHubClient>();
  482. var client = new ObservablePullRequestsClient(gitHubClient);
  483. client.Merge(1, 42, mergePullRequest);
  484. gitHubClient.Repository.PullRequest.Received().Merge(1, 42, mergePullRequest);
  485. }
  486. [Fact]
  487. public async Task EnsuresNonNullArguments()
  488. {
  489. var connection = Substitute.For<IGitHubClient>();
  490. var client = new ObservablePullRequestsClient(connection);
  491. Assert.Throws<ArgumentNullException>(() => client.Merge(null, "name", 42, new MergePullRequest { CommitMessage = "message" }));
  492. Assert.Throws<ArgumentNullException>(() => client.Merge("owner", null, 42, new MergePullRequest { CommitMessage = "message" }));
  493. Assert.Throws<ArgumentNullException>(() => client.Merge("owner", "name", 42, null));
  494. Assert.Throws<ArgumentNullException>(() => client.Merge(1, 42, null));
  495. Assert.Throws<ArgumentException>(() => client.Merge("", "name", 42, new MergePullRequest { CommitMessage = "message" }));
  496. Assert.Throws<ArgumentException>(() => client.Merge("owner", "", 42, new MergePullRequest { CommitMessage = "message" }));
  497. }
  498. }
  499. public class TheMergedMethod
  500. {
  501. [Fact]
  502. public void PullRequestMerged()
  503. {
  504. var gitHubClient = Substitute.For<IGitHubClient>();
  505. var client = new ObservablePullRequestsClient(gitHubClient);
  506. client.Merged("fake", "repo", 42);
  507. gitHubClient.Repository.PullRequest.Received().Merged("fake", "repo", 42);
  508. }
  509. [Fact]
  510. public void PullRequestMergedWithRepositoryId()
  511. {
  512. var gitHubClient = Substitute.For<IGitHubClient>();
  513. var client = new ObservablePullRequestsClient(gitHubClient);
  514. client.Merged(1, 42);
  515. gitHubClient.Repository.PullRequest.Received().Merged(1, 42);
  516. }
  517. [Fact]
  518. public async Task EnsuresNonNullArguments()
  519. {
  520. var connection = Substitute.For<IGitHubClient>();
  521. var client = new ObservablePullRequestsClient(connection);
  522. Assert.Throws<ArgumentNullException>(() => client.Merged(null, "name", 1));
  523. Assert.Throws<ArgumentNullException>(() => client.Merged("owner", null, 1));
  524. Assert.Throws<ArgumentException>(() => client.Merged("", "name", 1));
  525. Assert.Throws<ArgumentException>(() => client.Merged("owner", "", 1));
  526. }
  527. }
  528. public class TheCommitsMethod
  529. {
  530. [Fact]
  531. public async Task FetchesAllCommitsForPullRequest()
  532. {
  533. var commit = new PullRequestCommit(null, null, null, null, null, Enumerable.Empty<GitReference>(), null, null);
  534. var expectedUrl = "repos/fake/repo/pulls/42/commits";
  535. var gitHubClient = Substitute.For<IGitHubClient>();
  536. var connection = Substitute.For<IConnection>();
  537. IApiResponse<List<PullRequestCommit>> response = new ApiResponse<List<PullRequestCommit>>
  538. (
  539. new Response(),
  540. new List<PullRequestCommit> { commit }
  541. );
  542. connection.Get<List<PullRequestCommit>>(Args.Uri, null, null)
  543. .Returns(Task.FromResult(response));
  544. gitHubClient.Connection.Returns(connection);
  545. var client = new ObservablePullRequestsClient(gitHubClient);
  546. var commits = await client.Commits("fake", "repo", 42).ToList();
  547. Assert.Equal(1, commits.Count);
  548. Assert.Same(commit, commits[0]);
  549. connection.Received().Get<List<PullRequestCommit>>(new Uri(expectedUrl, UriKind.Relative), null, null);
  550. }
  551. [Fact]
  552. public async Task FetchesAllCommitsForPullRequestWithRepositoryId()
  553. {
  554. var commit = new PullRequestCommit(null, null, null, null, null, Enumerable.Empty<GitReference>(), null, null);
  555. var expectedUrl = "repositories/1/pulls/42/commits";
  556. var gitHubClient = Substitute.For<IGitHubClient>();
  557. var connection = Substitute.For<IConnection>();
  558. IApiResponse<List<PullRequestCommit>> response = new ApiResponse<List<PullRequestCommit>>
  559. (
  560. new Response(),
  561. new List<PullRequestCommit> { commit }
  562. );
  563. connection.Get<List<PullRequestCommit>>(Args.Uri, null, null)
  564. .Returns(Task.FromResult(response));
  565. gitHubClient.Connection.Returns(connection);
  566. var client = new ObservablePullRequestsClient(gitHubClient);
  567. var commits = await client.Commits(1, 42).ToList();
  568. Assert.Equal(1, commits.Count);
  569. Assert.Same(commit, commits[0]);
  570. connection.Received().Get<List<PullRequestCommit>>(new Uri(expectedUrl, UriKind.Relative), null, null);
  571. }
  572. [Fact]
  573. public async Task EnsuresNonNullArguments()
  574. {
  575. var connection = Substitute.For<IGitHubClient>();
  576. var client = new ObservablePullRequestsClient(connection);
  577. Assert.Throws<ArgumentNullException>(() => client.Commits(null, "name", 1));
  578. Assert.Throws<ArgumentNullException>(() => client.Commits("owner", null, 1));
  579. Assert.Throws<ArgumentException>(() => client.Commits("", "name", 1));
  580. Assert.Throws<ArgumentException>(() => client.Commits("owner", "", 1));
  581. }
  582. }
  583. public class TheFilesMethod
  584. {
  585. [Fact]
  586. public async Task FetchesAllFilesForPullRequest()
  587. {
  588. var file = new PullRequestFile(null, null, null, 0, 0, 0, null, null, null, null);
  589. var expectedUrl = "repos/fake/repo/pulls/42/files";
  590. var gitHubClient = Substitute.For<IGitHubClient>();
  591. var connection = Substitute.For<IConnection>();
  592. IApiResponse<List<PullRequestFile>> response = new ApiResponse<List<PullRequestFile>>
  593. (
  594. new Response(),
  595. new List<PullRequestFile> { file }
  596. );
  597. connection.Get<List<PullRequestFile>>(Args.Uri, null, null)
  598. .Returns(Task.FromResult(response));
  599. gitHubClient.Connection.Returns(connection);
  600. var client = new ObservablePullRequestsClient(gitHubClient);
  601. var files = await client.Files("fake", "repo", 42).ToList();
  602. Assert.Equal(1, files.Count);
  603. Assert.Same(file, files[0]);
  604. connection.Received().Get<List<PullRequestFile>>(new Uri(expectedUrl, UriKind.Relative), null, null);
  605. }
  606. [Fact]
  607. public async Task FetchesAllFilesForPullRequestWithRepositoryId()
  608. {
  609. var file = new PullRequestFile(null, null, null, 0, 0, 0, null, null, null, null);
  610. var expectedUrl = "repositories/1/pulls/42/files";
  611. var gitHubClient = Substitute.For<IGitHubClient>();
  612. var connection = Substitute.For<IConnection>();
  613. IApiResponse<List<PullRequestFile>> response = new ApiResponse<List<PullRequestFile>>
  614. (
  615. new Response(),
  616. new List<PullRequestFile> { file }
  617. );
  618. connection.Get<List<PullRequestFile>>(Args.Uri, null, null)
  619. .Returns(Task.FromResult(response));
  620. gitHubClient.Connection.Returns(connection);
  621. var client = new ObservablePullRequestsClient(gitHubClient);
  622. var files = await client.Files(1, 42).ToList();
  623. Assert.Equal(1, files.Count);
  624. Assert.Same(file, files[0]);
  625. connection.Received().Get<List<PullRequestFile>>(new Uri(expectedUrl, UriKind.Relative), null, null);
  626. }
  627. [Fact]
  628. public async Task EnsuresNonNullArguments()
  629. {
  630. var connection = Substitute.For<IGitHubClient>();
  631. var client = new ObservablePullRequestsClient(connection);
  632. Assert.Throws<ArgumentNullException>(() => client.Files(null, "name", 1));
  633. Assert.Throws<ArgumentNullException>(() => client.Files("owner", null, 1));
  634. Assert.Throws<ArgumentException>(() => client.Files("", "name", 1));
  635. Assert.Throws<ArgumentException>(() => client.Files("owner", "", 1));
  636. }
  637. }
  638. public class TheCtor
  639. {
  640. [Fact]
  641. public void EnsuresNonNullArguments()
  642. {
  643. Assert.Throws<ArgumentNullException>(() => new PullRequestsClient(null));
  644. }
  645. }
  646. static IResponse CreateResponseWithApiInfo(IDictionary<string, Uri> links)
  647. {
  648. var response = Substitute.For<IResponse>();
  649. response.ApiInfo.Returns(new ApiInfo(links, new List<string>(), new List<string>(), "etag", new RateLimit(new Dictionary<string, string>())));
  650. return response;
  651. }
  652. }
  653. }