PageRenderTime 49ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/Octokit.Tests/Clients/ReleasesClientTests.cs

https://gitlab.com/WoomyNightClub/GitHub-API-.NET
C# | 576 lines | 449 code | 127 blank | 0 comment | 26 complexity | 8694f7514801228f4091b8af785fee11 MD5 | raw file
  1. using System;
  2. using System.IO;
  3. using System.Threading.Tasks;
  4. using NSubstitute;
  5. using Xunit;
  6. namespace Octokit.Tests.Clients
  7. {
  8. public class ReleasesClientTests
  9. {
  10. public class TheCtor
  11. {
  12. [Fact]
  13. public void EnsuresNonNullArguments()
  14. {
  15. Assert.Throws<ArgumentNullException>(() =>
  16. new ReleasesClient(null));
  17. }
  18. }
  19. public class TheGetAllMethod
  20. {
  21. [Fact]
  22. public async Task RequestsCorrectUrl()
  23. {
  24. var client = Substitute.For<IApiConnection>();
  25. var releasesClient = new ReleasesClient(client);
  26. await releasesClient.GetAll("fake", "repo");
  27. client.Received().GetAll<Release>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases"),
  28. null,
  29. "application/vnd.github.v3",
  30. Args.ApiOptions);
  31. }
  32. [Fact]
  33. public async Task RequestsCorrectUrlWithRepositoryId()
  34. {
  35. var client = Substitute.For<IApiConnection>();
  36. var releasesClient = new ReleasesClient(client);
  37. await releasesClient.GetAll(1);
  38. client.Received().GetAll<Release>(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases"),
  39. null,
  40. "application/vnd.github.v3",
  41. Args.ApiOptions);
  42. }
  43. [Fact]
  44. public async Task RequestsCorrectUrlWithApiOptions()
  45. {
  46. var client = Substitute.For<IApiConnection>();
  47. var releasesClient = new ReleasesClient(client);
  48. var options = new ApiOptions
  49. {
  50. PageSize = 1,
  51. PageCount = 1,
  52. StartPage = 1
  53. };
  54. await releasesClient.GetAll("fake", "repo", options);
  55. client.Received().GetAll<Release>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases"),
  56. null,
  57. "application/vnd.github.v3",
  58. options);
  59. }
  60. [Fact]
  61. public async Task RequestsCorrectUrlWithRepositoryIdWithApiOptions()
  62. {
  63. var client = Substitute.For<IApiConnection>();
  64. var releasesClient = new ReleasesClient(client);
  65. var options = new ApiOptions
  66. {
  67. PageSize = 1,
  68. PageCount = 1,
  69. StartPage = 1
  70. };
  71. await releasesClient.GetAll(1, options);
  72. client.Received().GetAll<Release>(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases"),
  73. null,
  74. "application/vnd.github.v3",
  75. options);
  76. }
  77. [Fact]
  78. public async Task EnsuresNonNullArguments()
  79. {
  80. var releasesClient = new ReleasesClient(Substitute.For<IApiConnection>());
  81. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.GetAll(null, "name"));
  82. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.GetAll("owner", null));
  83. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.GetAll(null, "name", ApiOptions.None));
  84. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.GetAll("owner", null, ApiOptions.None));
  85. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.GetAll("owner", "name", null));
  86. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.GetAll(1, null));
  87. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.GetAll("", "name"));
  88. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.GetAll("owner", ""));
  89. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.GetAll("", "name", ApiOptions.None));
  90. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.GetAll("owner", "", ApiOptions.None));
  91. }
  92. }
  93. public class TheGetReleaseMethod
  94. {
  95. [Fact]
  96. public async Task RequestsTheCorrectUrl()
  97. {
  98. var connection = Substitute.For<IApiConnection>();
  99. var client = new ReleasesClient(connection);
  100. await client.Get("fake", "repo", 1);
  101. connection.Received().Get<Release>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases/1"));
  102. }
  103. [Fact]
  104. public async Task RequestsTheCorrectUrlWithRepositoryId()
  105. {
  106. var connection = Substitute.For<IApiConnection>();
  107. var client = new ReleasesClient(connection);
  108. await client.Get(1, 1);
  109. connection.Received().Get<Release>(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases/1"));
  110. }
  111. [Fact]
  112. public async Task EnsuresNonNullArguments()
  113. {
  114. var releasesClient = new ReleasesClient(Substitute.For<IApiConnection>());
  115. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.Get(null, "name", 1));
  116. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.Get("owner", null, 1));
  117. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.Get("", "name", 1));
  118. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.Get("owner", "", 1));
  119. }
  120. }
  121. public class TheGetLatestReleaseMethod
  122. {
  123. [Fact]
  124. public async Task RequestsTheCorrectUrl()
  125. {
  126. var connection = Substitute.For<IApiConnection>();
  127. var client = new ReleasesClient(connection);
  128. await client.GetLatest("fake", "repo");
  129. connection.Received().Get<Release>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases/latest"));
  130. }
  131. [Fact]
  132. public async Task RequestsTheCorrectUrlWithRepositoryId()
  133. {
  134. var connection = Substitute.For<IApiConnection>();
  135. var client = new ReleasesClient(connection);
  136. await client.GetLatest(1);
  137. connection.Received().Get<Release>(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases/latest"));
  138. }
  139. [Fact]
  140. public async Task EnsuresNonNullArguments()
  141. {
  142. var releasesClient = new ReleasesClient(Substitute.For<IApiConnection>());
  143. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.GetLatest(null, "name"));
  144. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.GetLatest("owner", null));
  145. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.GetLatest("", "name"));
  146. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.GetLatest("owner", ""));
  147. }
  148. }
  149. public class TheCreateReleaseMethod
  150. {
  151. [Fact]
  152. public async Task RequestsCorrectUrl()
  153. {
  154. var client = Substitute.For<IApiConnection>();
  155. var releasesClient = new ReleasesClient(client);
  156. var data = new NewRelease("fake-tag");
  157. await releasesClient.Create("fake", "repo", data);
  158. client.Received().Post<Release>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases"),
  159. data,
  160. "application/vnd.github.v3");
  161. }
  162. [Fact]
  163. public async Task RequestsCorrectUrlWithRepositoryId()
  164. {
  165. var client = Substitute.For<IApiConnection>();
  166. var releasesClient = new ReleasesClient(client);
  167. var data = new NewRelease("fake-tag");
  168. await releasesClient.Create(1, data);
  169. client.Received().Post<Release>(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases"),
  170. data,
  171. "application/vnd.github.v3");
  172. }
  173. [Fact]
  174. public async Task EnsuresNonNullArguments()
  175. {
  176. var releasesClient = new ReleasesClient(Substitute.For<IApiConnection>());
  177. Assert.Throws<ArgumentNullException>(() => new NewRelease(null));
  178. var data = new NewRelease("fake-tag");
  179. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.Create(null, "name", data));
  180. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.Create("owner", null, data));
  181. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.Create("owner", "name", null));
  182. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.Create(1, null));
  183. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.Create("", "name", data));
  184. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.Create("owner", "", data));
  185. }
  186. }
  187. public class TheEditReleaseMethod
  188. {
  189. [Fact]
  190. public async Task RequestsTheCorrectUrl()
  191. {
  192. var connection = Substitute.For<IApiConnection>();
  193. var releasesClient = new ReleasesClient(connection);
  194. var data = new ReleaseUpdate { TagName = "fake-tag" };
  195. await releasesClient.Edit("fake", "repo", 1, data);
  196. connection.Received().Patch<Release>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases/1"), data);
  197. }
  198. [Fact]
  199. public async Task RequestsTheCorrectUrlWithRepositoryId()
  200. {
  201. var connection = Substitute.For<IApiConnection>();
  202. var releasesClient = new ReleasesClient(connection);
  203. var data = new ReleaseUpdate { TagName = "fake-tag" };
  204. await releasesClient.Edit(1, 1, data);
  205. connection.Received().Patch<Release>(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases/1"), data);
  206. }
  207. [Fact]
  208. public async Task EnsuresNonNullArguments()
  209. {
  210. var releasesClient = new ReleasesClient(Substitute.For<IApiConnection>());
  211. var releaseUpdate = new ReleaseUpdate { TagName = "tag" };
  212. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.Edit(null, "name", 1, releaseUpdate));
  213. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.Edit("owner", null, 1, releaseUpdate));
  214. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.Edit("owner", "name", 1, null));
  215. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.Edit(1, 1, null));
  216. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.Edit("", "name", 1, releaseUpdate));
  217. await Assert.ThrowsAsync<ArgumentException>(() => releasesClient.Edit("owner", "", 1, releaseUpdate));
  218. }
  219. }
  220. public class TheDeleteReleaseMethod
  221. {
  222. [Fact]
  223. public async Task RequestsTheCorrectUrl()
  224. {
  225. var connection = Substitute.For<IApiConnection>();
  226. var client = new ReleasesClient(connection);
  227. await client.Delete("fake", "repo", 1);
  228. connection.Received().Delete(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases/1"));
  229. }
  230. [Fact]
  231. public async Task RequestsTheCorrectUrlWithRepositoryId()
  232. {
  233. var connection = Substitute.For<IApiConnection>();
  234. var client = new ReleasesClient(connection);
  235. await client.Delete(1, 1);
  236. connection.Received().Delete(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases/1"));
  237. }
  238. [Fact]
  239. public async Task EnsuresNonNullArguments()
  240. {
  241. var client = new ReleasesClient(Substitute.For<IApiConnection>());
  242. await Assert.ThrowsAsync<ArgumentNullException>(() => client.Delete(null, "name", 1));
  243. await Assert.ThrowsAsync<ArgumentNullException>(() => client.Delete("owner", null, 1));
  244. await Assert.ThrowsAsync<ArgumentException>(() => client.Delete("", "name", 1));
  245. await Assert.ThrowsAsync<ArgumentException>(() => client.Delete("owner", "", 1));
  246. }
  247. }
  248. public class TheGetAssetsMethod
  249. {
  250. [Fact]
  251. public async Task RequestsTheCorrectUrl()
  252. {
  253. var connection = Substitute.For<IApiConnection>();
  254. var client = new ReleasesClient(connection);
  255. await client.GetAllAssets("fake", "repo", 1);
  256. connection.Received().GetAll<ReleaseAsset>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases/1/assets"),
  257. null,
  258. "application/vnd.github.v3",
  259. Args.ApiOptions);
  260. }
  261. [Fact]
  262. public async Task RequestsTheCorrectUrlWithRepositoryId()
  263. {
  264. var connection = Substitute.For<IApiConnection>();
  265. var client = new ReleasesClient(connection);
  266. await client.GetAllAssets(1, 1);
  267. connection.Received().GetAll<ReleaseAsset>(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases/1/assets"),
  268. null,
  269. "application/vnd.github.v3",
  270. Args.ApiOptions);
  271. }
  272. [Fact]
  273. public async Task RequestsTheCorrectUrlWithApiOptions()
  274. {
  275. var connection = Substitute.For<IApiConnection>();
  276. var client = new ReleasesClient(connection);
  277. var options = new ApiOptions
  278. {
  279. StartPage = 1,
  280. PageCount = 1,
  281. PageSize = 1
  282. };
  283. await client.GetAllAssets("fake", "repo", 1, options);
  284. connection.Received().GetAll<ReleaseAsset>(
  285. Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases/1/assets"),
  286. null,
  287. "application/vnd.github.v3", options);
  288. }
  289. [Fact]
  290. public async Task RequestsTheCorrectUrlWithRepositoryIdWithApiOptions()
  291. {
  292. var connection = Substitute.For<IApiConnection>();
  293. var client = new ReleasesClient(connection);
  294. var options = new ApiOptions
  295. {
  296. StartPage = 1,
  297. PageCount = 1,
  298. PageSize = 1
  299. };
  300. await client.GetAllAssets(1, 1, options);
  301. connection.Received().GetAll<ReleaseAsset>(
  302. Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases/1/assets"),
  303. null,
  304. "application/vnd.github.v3", options);
  305. }
  306. [Fact]
  307. public async Task EnsuresNonNullArguments()
  308. {
  309. var client = new ReleasesClient(Substitute.For<IApiConnection>());
  310. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetAllAssets(null, "name", 1));
  311. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetAllAssets("owner", null, 1));
  312. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetAllAssets(null, "name", 1, ApiOptions.None));
  313. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetAllAssets("owner", null, 1, ApiOptions.None));
  314. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetAllAssets("owner", "name", 1, null));
  315. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetAllAssets(1, 1, null));
  316. await Assert.ThrowsAsync<ArgumentException>(() => client.GetAllAssets("", "name", 1));
  317. await Assert.ThrowsAsync<ArgumentException>(() => client.GetAllAssets("owner", "", 1));
  318. }
  319. }
  320. public class TheUploadReleaseAssetMethod
  321. {
  322. [Fact]
  323. public async Task UploadsToCorrectUrl()
  324. {
  325. var client = Substitute.For<IApiConnection>();
  326. var releasesClient = new ReleasesClient(client);
  327. var release = new Release("https://uploads.test.dev/does/not/matter/releases/1/assets{?name}");
  328. var rawData = Substitute.For<Stream>();
  329. var upload = new ReleaseAssetUpload("example.zip", "application/zip", rawData, null);
  330. await releasesClient.UploadAsset(release, upload);
  331. client.Received().Post<ReleaseAsset>(
  332. Arg.Is<Uri>(u => u.ToString() == "https://uploads.test.dev/does/not/matter/releases/1/assets?name=example.zip"),
  333. rawData,
  334. "application/vnd.github.v3",
  335. Arg.Is<string>(contentType => contentType == "application/zip"));
  336. }
  337. [Fact]
  338. public async Task EnsuresNonNullArguments()
  339. {
  340. var releasesClient = new ReleasesClient(Substitute.For<IApiConnection>());
  341. var release = new Release("https://uploads.github.com/anything");
  342. var uploadData = new ReleaseAssetUpload("good", "good/good", Stream.Null, null);
  343. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.UploadAsset(null, uploadData));
  344. await Assert.ThrowsAsync<ArgumentNullException>(() => releasesClient.UploadAsset(release, null));
  345. }
  346. [Fact]
  347. public async Task OverrideDefaultTimeout()
  348. {
  349. var newTimeout = TimeSpan.FromSeconds(100);
  350. var apiConnection = Substitute.For<IApiConnection>();
  351. var fixture = new ReleasesClient(apiConnection);
  352. var release = new Release("https://uploads.github.com/anything");
  353. var uploadData = new ReleaseAssetUpload("good", "good/good", Stream.Null, newTimeout);
  354. await fixture.UploadAsset(release, uploadData);
  355. apiConnection.Received().Post<ReleaseAsset>(Arg.Any<Uri>(), uploadData.RawData, Arg.Any<string>(), uploadData.ContentType, newTimeout);
  356. }
  357. }
  358. public class TheGetAssetMethod
  359. {
  360. [Fact]
  361. public async Task RequestsTheCorrectUrl()
  362. {
  363. var connection = Substitute.For<IApiConnection>();
  364. var client = new ReleasesClient(connection);
  365. await client.GetAsset("fake", "repo", 1);
  366. connection.Received().Get<ReleaseAsset>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases/assets/1"));
  367. }
  368. [Fact]
  369. public async Task RequestsTheCorrectUrlWithRepositoryId()
  370. {
  371. var connection = Substitute.For<IApiConnection>();
  372. var client = new ReleasesClient(connection);
  373. await client.GetAsset(1, 1);
  374. connection.Received().Get<ReleaseAsset>(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases/assets/1"));
  375. }
  376. [Fact]
  377. public async Task EnsuresNonNullArguments()
  378. {
  379. var client = new ReleasesClient(Substitute.For<IApiConnection>());
  380. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetAsset(null, "name", 1));
  381. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetAsset("owner", null, 1));
  382. await Assert.ThrowsAsync<ArgumentException>(() => client.GetAsset("", "name", 1));
  383. await Assert.ThrowsAsync<ArgumentException>(() => client.GetAsset("owner", "", 1));
  384. }
  385. }
  386. public class TheEditAssetMethod
  387. {
  388. [Fact]
  389. public async Task RequestsTheCorrectUrl()
  390. {
  391. var connection = Substitute.For<IApiConnection>();
  392. var client = new ReleasesClient(connection);
  393. var data = new ReleaseAssetUpdate("asset");
  394. await client.EditAsset("fake", "repo", 1, data);
  395. connection.Received().Patch<ReleaseAsset>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases/assets/1"),
  396. data);
  397. }
  398. [Fact]
  399. public async Task RequestsTheCorrectUrlWithRepositoryId()
  400. {
  401. var connection = Substitute.For<IApiConnection>();
  402. var client = new ReleasesClient(connection);
  403. var data = new ReleaseAssetUpdate("asset");
  404. await client.EditAsset(1, 1, data);
  405. connection.Received().Patch<ReleaseAsset>(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases/assets/1"),
  406. data);
  407. }
  408. [Fact]
  409. public async Task EnsuresNonNullArguments()
  410. {
  411. var client = new ReleasesClient(Substitute.For<IApiConnection>());
  412. await Assert.ThrowsAsync<ArgumentNullException>(() => client.EditAsset(null, "name", 1, new ReleaseAssetUpdate("name")));
  413. await Assert.ThrowsAsync<ArgumentNullException>(() => client.EditAsset("owner", null, 1, new ReleaseAssetUpdate("name")));
  414. await Assert.ThrowsAsync<ArgumentNullException>(() => client.EditAsset("owner", "name", 1, null));
  415. await Assert.ThrowsAsync<ArgumentNullException>(() => client.EditAsset(1, 1, null));
  416. await Assert.ThrowsAsync<ArgumentException>(() => client.EditAsset("", "name", 1, new ReleaseAssetUpdate("name")));
  417. await Assert.ThrowsAsync<ArgumentException>(() => client.EditAsset("owner", "", 1, new ReleaseAssetUpdate("name")));
  418. }
  419. }
  420. public class TheDeleteAssetMethod
  421. {
  422. [Fact]
  423. public async Task RequestsTheCorrectUrl()
  424. {
  425. var connection = Substitute.For<IApiConnection>();
  426. var client = new ReleasesClient(connection);
  427. await client.DeleteAsset("fake", "repo", 1);
  428. connection.Received().Delete(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/releases/assets/1"));
  429. }
  430. [Fact]
  431. public async Task RequestsTheCorrectUrlWithRepositoryId()
  432. {
  433. var connection = Substitute.For<IApiConnection>();
  434. var client = new ReleasesClient(connection);
  435. await client.DeleteAsset(1, 1);
  436. connection.Received().Delete(Arg.Is<Uri>(u => u.ToString() == "repositories/1/releases/assets/1"));
  437. }
  438. [Fact]
  439. public async Task EnsuresNonNullArguments()
  440. {
  441. var client = new ReleasesClient(Substitute.For<IApiConnection>());
  442. await Assert.ThrowsAsync<ArgumentNullException>(() => client.DeleteAsset(null, "name", 1));
  443. await Assert.ThrowsAsync<ArgumentNullException>(() => client.DeleteAsset("owner", null, 1));
  444. await Assert.ThrowsAsync<ArgumentException>(() => client.DeleteAsset("", "name", 1));
  445. await Assert.ThrowsAsync<ArgumentException>(() => client.DeleteAsset("owner", "", 1));
  446. }
  447. }
  448. }
  449. }