PageRenderTime 55ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/Atlassian.Jira.Test.Integration/IntegrationTest.cs

https://bitbucket.org/yyo/atlassian.net-sdk-v2.0
C# | 661 lines | 505 code | 138 blank | 18 comment | 38 complexity | c78cb167df95ab0942ff47f6dc686c10 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Xunit;
  6. using System.IO;
  7. namespace Atlassian.Jira.Test.Integration
  8. {
  9. public class IntegrationTest
  10. {
  11. private readonly Jira _jira;
  12. private readonly Random _random;
  13. public IntegrationTest()
  14. {
  15. _jira = new Jira("http://localhost:2990/jira", "admin", "admin");
  16. _jira.Debug = true;
  17. _random = new Random();
  18. }
  19. [Fact]
  20. void Transition_ResolveIssue()
  21. {
  22. var issue = _jira.CreateIssue("TST");
  23. issue.Summary = "Issue to resolve " + _random.Next(int.MaxValue);
  24. issue.Type = "Bug";
  25. issue.SaveChanges();
  26. issue.WorkflowTransition(WorkflowActions.Resolve);
  27. Assert.Equal("Resolved", issue.Status.Name);
  28. Assert.Equal("Fixed", issue.Resolution.Name);
  29. }
  30. [Fact]
  31. void Transition_ResolveIssue_AsWontFix()
  32. {
  33. var issue = _jira.CreateIssue("TST");
  34. issue.Summary = "Issue to resolve " + _random.Next(int.MaxValue);
  35. issue.Type = "Bug";
  36. issue.SaveChanges();
  37. issue.Resolution = "Won't Fix";
  38. issue.WorkflowTransition(WorkflowActions.Resolve);
  39. Assert.Equal("Resolved", issue.Status.Name);
  40. Assert.Equal("Won't Fix", issue.Resolution.Name);
  41. }
  42. [Fact]
  43. public void GetFilters()
  44. {
  45. var filters = _jira.GetFilters();
  46. Assert.Equal(1, filters.Count());
  47. Assert.Equal("One Issue Filter", filters.First().Name);
  48. }
  49. [Fact]
  50. public void GetIssuesFromFilter()
  51. {
  52. var issues = _jira.GetIssuesFromFilter("One Issue Filter");
  53. Assert.Equal(1, issues.Count());
  54. Assert.Equal("TST-1", issues.First().Key.Value);
  55. }
  56. [Fact]
  57. public void QueryWithZeroResults()
  58. {
  59. var issues = from i in _jira.Issues
  60. where i.Created == new DateTime(2010,1,1)
  61. select i;
  62. Assert.Equal(0, issues.Count());
  63. }
  64. [Fact]
  65. public void UpdateNamedEntities_ById()
  66. {
  67. var issue = _jira.CreateIssue("TST");
  68. issue.Summary = "AutoLoadNamedEntities_ById " + _random.Next(int.MaxValue);
  69. issue.Type = "1";
  70. issue.Priority = "5";
  71. issue.SaveChanges();
  72. Assert.Equal("1", issue.Type.Id);
  73. Assert.Equal("Bug", issue.Type.Name);
  74. Assert.Equal("5", issue.Priority.Id);
  75. Assert.Equal("Trivial", issue.Priority.Name);
  76. }
  77. [Fact]
  78. public void UpdateNamedEntities_ByName()
  79. {
  80. var issue = _jira.CreateIssue("TST");
  81. issue.Summary = "AutoLoadNamedEntities_Name " + _random.Next(int.MaxValue);
  82. issue.Type = "Bug";
  83. issue.Priority = "Trivial";
  84. issue.SaveChanges();
  85. Assert.Equal("1", issue.Type.Id);
  86. Assert.Equal("Bug", issue.Type.Name);
  87. Assert.Equal("5", issue.Priority.Id);
  88. Assert.Equal("Trivial", issue.Priority.Name);
  89. }
  90. [Fact]
  91. public void RetrieveNamedEntities()
  92. {
  93. var issue = _jira.GetIssue("TST-1");
  94. Assert.Equal("Bug", issue.Type.Name);
  95. Assert.Equal("Major", issue.Priority.Name);
  96. Assert.Equal("Open", issue.Status.Name);
  97. Assert.Null(issue.Resolution);
  98. }
  99. [Fact]
  100. public void CreateAndQueryIssueWithMinimumFieldsSet()
  101. {
  102. var summaryValue = "Test Summary " + _random.Next(int.MaxValue);
  103. var issue = new Issue(_jira, "TST")
  104. {
  105. Type = "1",
  106. Summary = summaryValue
  107. };
  108. issue.SaveChanges();
  109. var issues = (from i in _jira.Issues
  110. where i.Key == issue.Key
  111. select i).ToArray();
  112. Assert.Equal(1, issues.Count());
  113. Assert.Equal(summaryValue, issues[0].Summary);
  114. Assert.Equal("TST", issues[0].Project);
  115. Assert.Equal("1", issues[0].Type.Id);
  116. }
  117. [Fact]
  118. public void CreateAndQueryIssueWithAllFieldsSet()
  119. {
  120. var summaryValue = "Test Summary " + _random.Next(int.MaxValue);
  121. var issue = _jira.CreateIssue("TST");
  122. issue.AffectsVersions.Add("1.0");
  123. issue.Assignee = "admin";
  124. issue.Components.Add("Server");
  125. issue["Custom Text Field"] = "Test Value"; // custom field
  126. issue.Description = "Test Description";
  127. issue.DueDate = new DateTime(2011, 12, 12);
  128. issue.Environment = "Test Environment";
  129. issue.FixVersions.Add("2.0");
  130. issue.Priority = "Major";
  131. issue.Reporter = "admin";
  132. issue.Summary = summaryValue;
  133. issue.Type = "1";
  134. issue.SaveChanges();
  135. var queriedIssues = (from i in _jira.Issues
  136. where i.Key == issue.Key
  137. select i).ToArray();
  138. Assert.Equal(summaryValue, queriedIssues[0].Summary);
  139. }
  140. [Fact]
  141. public void UpdateIssueType()
  142. {
  143. var summaryValue = "Test Summary " + _random.Next(int.MaxValue);
  144. var issue = new Issue(_jira, "TST")
  145. {
  146. Type = "1",
  147. Summary = summaryValue
  148. };
  149. issue.SaveChanges();
  150. //retrieve the issue from server and update
  151. issue = _jira.GetIssue(issue.Key.Value);
  152. issue.Type = "2";
  153. issue.SaveChanges();
  154. //retrieve again and verify
  155. issue = _jira.GetIssue(issue.Key.Value);
  156. Assert.Equal("2", issue.Type.Id);
  157. }
  158. [Fact]
  159. public void UpdateWithAllFieldsSet()
  160. {
  161. // arrange, create an issue to test.
  162. var summaryValue = "Test Summary " + _random.Next(int.MaxValue);
  163. var issue = new Issue(_jira, "TST")
  164. {
  165. Assignee = "admin",
  166. Description = "Test Description",
  167. DueDate = new DateTime(2011, 12, 12),
  168. Environment = "Test Environment",
  169. Reporter = "admin",
  170. Type = "1",
  171. Summary = summaryValue
  172. };
  173. issue.SaveChanges();
  174. // act, get an issue and update it
  175. var serverIssue = (from i in _jira.Issues
  176. where i.Key == issue.Key
  177. select i).ToArray().First();
  178. serverIssue.Description = "Updated Description";
  179. serverIssue.DueDate = new DateTime(2011, 10, 10);
  180. serverIssue.Environment = "Updated Environment";
  181. serverIssue.Summary = "Updated " + summaryValue;
  182. serverIssue.SaveChanges();
  183. // assert, get the issue again and verify
  184. var newServerIssue = (from i in _jira.Issues
  185. where i.Key == issue.Key
  186. select i).ToArray().First();
  187. Assert.Equal("Updated " + summaryValue, newServerIssue.Summary);
  188. Assert.Equal("Updated Description", newServerIssue.Description);
  189. Assert.Equal("Updated Environment", newServerIssue.Environment);
  190. // Note: Dates returned from JIRA are UTC
  191. Assert.Equal(new DateTime(2011, 10, 10).ToUniversalTime(), newServerIssue.DueDate);
  192. }
  193. [Fact]
  194. public void UploadAndDownloadOfAttachments()
  195. {
  196. var summaryValue = "Test Summary with attachment " + _random.Next(int.MaxValue);
  197. var issue = new Issue(_jira, "TST")
  198. {
  199. Type = "1",
  200. Summary = summaryValue
  201. };
  202. // create an issue, verify no attachments
  203. issue.SaveChanges();
  204. Assert.Equal(0, issue.GetAttachments().Count);
  205. // upload multiple attachments
  206. File.WriteAllText("testfile1.txt", "Test File Content 1");
  207. File.WriteAllText("testfile2.txt", "Test File Content 2");
  208. issue.AddAttachment("testfile1.txt", "testfile2.txt");
  209. var attachments = issue.GetAttachments();
  210. Assert.Equal(2, attachments.Count);
  211. Assert.True(attachments.Any(a => a.FileName.Equals("testfile1.txt")), "'testfile1.txt' was not downloaded from server");
  212. Assert.True(attachments.Any(a => a.FileName.Equals("testfile2.txt")), "'testfile2.txt' was not downloaded from server");
  213. // download an attachment
  214. var tempFile = Path.GetTempFileName();
  215. attachments.First(a => a.FileName.Equals("testfile1.txt")).Download(tempFile);
  216. Assert.Equal("Test File Content 1", File.ReadAllText(tempFile));
  217. }
  218. [Fact]
  219. public void AddAndGetComments()
  220. {
  221. var summaryValue = "Test Summary " + _random.Next(int.MaxValue);
  222. var issue = new Issue(_jira, "TST")
  223. {
  224. Type = "1",
  225. Summary = summaryValue
  226. };
  227. // create an issue, verify no comments
  228. issue.SaveChanges();
  229. Assert.Equal(0, issue.GetComments().Count);
  230. // Add a comment
  231. issue.AddComment("new comment");
  232. var comments = issue.GetComments();
  233. Assert.Equal(1, comments.Count);
  234. Assert.Equal("new comment", comments[0].Body);
  235. }
  236. [Fact]
  237. public void MaximumNumberOfIssuesPerRequest()
  238. {
  239. // create 2 issues with same summary
  240. var randomNumber = _random.Next(int.MaxValue);
  241. (new Issue(_jira, "TST") { Type = "1", Summary = "Test Summary " + randomNumber }).SaveChanges();
  242. (new Issue(_jira, "TST") { Type = "1", Summary = "Test Summary " + randomNumber }).SaveChanges();
  243. //set maximum issues and query
  244. _jira.MaxIssuesPerRequest = 1;
  245. var issues = from i in _jira.Issues
  246. where i.Summary == randomNumber.ToString()
  247. select i;
  248. Assert.Equal(1, issues.Count());
  249. }
  250. [Fact]
  251. public void QueryIssueWithCustomDateField()
  252. {
  253. var issue = (from i in _jira.Issues
  254. where i["Custom Date Field"] <= new DateTime(2012,4,1)
  255. select i).First();
  256. Assert.Equal("Sample bug in Test Project", issue.Summary);
  257. }
  258. [Fact]
  259. public void QueryIssuesWithTakeExpression()
  260. {
  261. // create 2 issues with same summary
  262. var randomNumber = _random.Next(int.MaxValue);
  263. (new Issue(_jira, "TST") { Type = "1", Summary = "Test Summary " + randomNumber }).SaveChanges();
  264. (new Issue(_jira, "TST") { Type = "1", Summary = "Test Summary " + randomNumber }).SaveChanges();
  265. // query with take method to only return 1
  266. var issues = (from i in _jira.Issues
  267. where i.Summary == randomNumber.ToString()
  268. select i).Take(1);
  269. Assert.Equal(1, issues.Count());
  270. }
  271. [Fact]
  272. public void GetIssueTypes()
  273. {
  274. var issueTypes = _jira.GetIssueTypes("TST");
  275. Assert.Equal(4, issueTypes.Count());
  276. Assert.True(issueTypes.Any(i => i.Name == "Bug"));
  277. }
  278. [Fact]
  279. public void GetIssuePriorities()
  280. {
  281. var priorities = _jira.GetIssuePriorities();
  282. Assert.True(priorities.Any(i => i.Name == "Blocker"));
  283. }
  284. [Fact]
  285. public void GetIssueResolutions()
  286. {
  287. var resolutions = _jira.GetIssueResolutions();
  288. Assert.True(resolutions.Any(i => i.Name == "Fixed"));
  289. }
  290. [Fact]
  291. public void GetIssueStatuses()
  292. {
  293. var statuses = _jira.GetIssueStatuses();
  294. Assert.True(statuses.Any(i => i.Name == "Open"));
  295. }
  296. /// <summary>
  297. /// https://bitbucket.org/farmas/atlassian.net-sdk/issue/3/serialization-error-when-querying-some
  298. /// </summary>
  299. [Fact]
  300. public void HandleRetrievalOfMessagesWithLargeContentStrings()
  301. {
  302. var issue = new Issue(_jira, "TST")
  303. {
  304. Type = "1",
  305. Summary = "Serialization nastiness"
  306. };
  307. issue.Description = File.ReadAllText("LongIssueDescription.txt");
  308. issue.SaveChanges();
  309. Assert.Contains("Second stack trace:", issue.Description);
  310. }
  311. [Fact]
  312. public void GetCustomFields()
  313. {
  314. var fields = _jira.GetCustomFields();
  315. Assert.Equal(2, fields.Count());
  316. }
  317. [Fact]
  318. public void GetProjectVersions()
  319. {
  320. var versions = _jira.GetProjectVersions("TST");
  321. Assert.Equal(3, versions.Count());
  322. }
  323. [Fact]
  324. public void GetProjectComponents()
  325. {
  326. var components = _jira.GetProjectComponents("TST");
  327. Assert.Equal(2, components.Count());
  328. }
  329. [Fact]
  330. public void UpdateVersions()
  331. {
  332. var summaryValue = "Test issue with versions (Updated)" + _random.Next(int.MaxValue);
  333. var issue = new Issue(_jira, "TST")
  334. {
  335. Type = "1",
  336. Summary = summaryValue
  337. };
  338. issue.SaveChanges();
  339. issue.AffectsVersions.Add("1.0");
  340. issue.AffectsVersions.Add("2.0");
  341. issue.FixVersions.Add("3.0");
  342. issue.FixVersions.Add("2.0");
  343. issue.SaveChanges();
  344. Assert.Equal(2, issue.AffectsVersions.Count);
  345. Assert.True(issue.AffectsVersions.Any(v => v.Name == "1.0"));
  346. Assert.True(issue.AffectsVersions.Any(v => v.Name == "2.0"));
  347. Assert.Equal(2, issue.FixVersions.Count);
  348. Assert.True(issue.FixVersions.Any(v => v.Name == "2.0"));
  349. Assert.True(issue.FixVersions.Any(v => v.Name == "3.0"));
  350. }
  351. [Fact]
  352. public void CreateAndQueryIssueWithVersions()
  353. {
  354. var summaryValue = "Test issue with versions (Created)" + _random.Next(int.MaxValue);
  355. var issue = new Issue(_jira, "TST")
  356. {
  357. Type = "1",
  358. Summary = summaryValue
  359. };
  360. issue.AffectsVersions.Add("1.0");
  361. issue.AffectsVersions.Add("2.0");
  362. issue.FixVersions.Add("3.0");
  363. issue.FixVersions.Add("2.0");
  364. issue.SaveChanges();
  365. var newIssue = (from i in _jira.Issues
  366. where i.AffectsVersions == "1.0" && i.AffectsVersions == "2.0"
  367. && i.FixVersions == "2.0" && i.FixVersions == "3.0"
  368. select i).First();
  369. Assert.Equal(2, newIssue.AffectsVersions.Count);
  370. Assert.True(newIssue.AffectsVersions.Any(v => v.Name == "1.0"));
  371. Assert.True(newIssue.AffectsVersions.Any(v => v.Name == "2.0"));
  372. Assert.Equal(2, newIssue.FixVersions.Count);
  373. Assert.True(newIssue.FixVersions.Any(v => v.Name == "2.0"));
  374. Assert.True(newIssue.FixVersions.Any(v => v.Name == "3.0"));
  375. }
  376. [Fact]
  377. public void CreateAndQueryIssueWithComponents()
  378. {
  379. var summaryValue = "Test issue with components (Created)" + _random.Next(int.MaxValue);
  380. var issue = new Issue(_jira, "TST")
  381. {
  382. Type = "1",
  383. Summary = summaryValue
  384. };
  385. issue.Components.Add("Server");
  386. issue.Components.Add("Client");
  387. issue.SaveChanges();
  388. var newIssue = (from i in _jira.Issues
  389. where i.Summary == summaryValue && i.Components == "Server" && i.Components == "Client"
  390. select i).First();
  391. Assert.Equal(2, newIssue.Components.Count);
  392. Assert.True(newIssue.Components.Any(c => c.Name == "Server"));
  393. Assert.True(newIssue.Components.Any(c => c.Name == "Client"));
  394. }
  395. [Fact]
  396. public void UpdateComponents()
  397. {
  398. var summaryValue = "Test issue with components (Updated)" + _random.Next(int.MaxValue);
  399. var issue = new Issue(_jira, "TST")
  400. {
  401. Type = "1",
  402. Summary = summaryValue
  403. };
  404. issue.SaveChanges();
  405. issue.Components.Add("Server");
  406. issue.Components.Add("Client");
  407. issue.SaveChanges();
  408. Assert.Equal(2, issue.Components.Count);
  409. Assert.True(issue.Components.Any(c => c.Name == "Server"));
  410. Assert.True(issue.Components.Any(c => c.Name == "Client"));
  411. }
  412. [Fact]
  413. public void AddLabelsToIssue()
  414. {
  415. var summaryValue = "Test issue with labels (Updated)" + _random.Next(int.MaxValue);
  416. var issue = new Issue(_jira, "TST")
  417. {
  418. Type = "1",
  419. Summary = summaryValue
  420. };
  421. issue.SaveChanges();
  422. issue.AddLabels("label1", "label2");
  423. }
  424. [Fact]
  425. public void CreateAndQueryIssueWithCustomField()
  426. {
  427. var summaryValue = "Test issue with custom field (Created)" + _random.Next(int.MaxValue);
  428. var issue = new Issue(_jira, "TST")
  429. {
  430. Type = "1",
  431. Summary = summaryValue
  432. };
  433. issue["Custom Text Field"] = "My new value";
  434. issue.SaveChanges();
  435. var newIssue = (from i in _jira.Issues
  436. where i.Summary == summaryValue && i["Custom Text Field"] == "My new value"
  437. select i).First();
  438. Assert.Equal("My new value", newIssue["Custom Text Field"]);
  439. }
  440. [Fact]
  441. public void UpdateIssueWithCustomFieldWhenItWasEmpty()
  442. {
  443. var summaryValue = "Test issue with custom field " + _random.Next(int.MaxValue);
  444. var issue = new Issue(_jira, "TST")
  445. {
  446. Type = "1",
  447. Summary = summaryValue
  448. };
  449. issue.SaveChanges();
  450. issue["Custom Text Field"] = "My new value";
  451. issue.SaveChanges();
  452. Assert.Equal("My new value", issue["Custom Text Field"]);
  453. }
  454. [Fact]
  455. public void UpdateIssueWithCustomField()
  456. {
  457. var summaryValue = "Test issue with custom field (Updated)" + _random.Next(int.MaxValue);
  458. var issue = new Issue(_jira, "TST")
  459. {
  460. Type = "1",
  461. Summary = summaryValue
  462. };
  463. issue["Custom Text Field"] = "My new value";
  464. issue.SaveChanges();
  465. issue["Custom Text Field"] = "My updated value";
  466. issue.SaveChanges();
  467. Assert.Equal("My updated value", issue["Custom Text Field"]);
  468. }
  469. [Fact]
  470. public void AddAndGetWorklogs()
  471. {
  472. var summaryValue = "Test issue with work logs" + _random.Next(int.MaxValue);
  473. var issue = new Issue(_jira, "TST")
  474. {
  475. Type = "1",
  476. Summary = summaryValue
  477. };
  478. issue.SaveChanges();
  479. issue.AddWorklog("1d");
  480. issue.AddWorklog("1h", WorklogStrategy.RetainRemainingEstimate);
  481. issue.AddWorklog("1m", WorklogStrategy.NewRemainingEstimate, "2d");
  482. issue.AddWorklog(new Worklog("2d", new DateTime(2012, 1, 1), "comment"));
  483. var logs = issue.GetWorklogs();
  484. Assert.Equal(4, logs.Count);
  485. Assert.Equal("comment", logs.ElementAt(3).Comment);
  486. Assert.Equal(new DateTime(2012, 1, 1), logs.ElementAt(3).StartDate);
  487. }
  488. [Fact]
  489. public void GetProjects()
  490. {
  491. Assert.Equal(1, _jira.GetProjects().Count());
  492. }
  493. [Fact]
  494. public void AddIssueAsSubtask()
  495. {
  496. var summaryValue = "Test issue as subtask " + _random.Next(int.MaxValue);
  497. var issue = new Issue(_jira, "TST", "TST-1")
  498. {
  499. Type = "5", //subtask
  500. Summary = summaryValue
  501. };
  502. issue.SaveChanges();
  503. var subtasks = _jira.GetIssuesFromJql("project = TST and parent = TST-1");
  504. Assert.True(subtasks.Any(s => s.Summary.Equals(summaryValue)),
  505. String.Format("'{0}' was not found as a sub-task of TST-1", summaryValue));
  506. }
  507. [Fact]
  508. public void DeleteWorklog()
  509. {
  510. var summary = "Test issue with worklogs" + _random.Next(int.MaxValue);
  511. var issue = new Issue(_jira, "TST")
  512. {
  513. Type = "1",
  514. Summary = summary
  515. };
  516. issue.SaveChanges();
  517. var worklog = issue.AddWorklog("1h");
  518. Assert.Equal(1, issue.GetWorklogs().Count);
  519. issue.DeleteWorklog(worklog);
  520. Assert.Equal(0, issue.GetWorklogs().Count);
  521. }
  522. }
  523. }