PageRenderTime 52ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/Atlassian.Jira.Test/IssueTest.cs

https://bitbucket.org/headspring/atlassian.net-sdk
C# | 698 lines | 572 code | 104 blank | 22 comment | 9 complexity | bf4a9833c64dde450ad9e420ea391654 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Xunit;
  6. using Atlassian.Jira.Remote;
  7. using Moq;
  8. using System.IO;
  9. namespace Atlassian.Jira.Test
  10. {
  11. public class IssueTest
  12. {
  13. public class FromJson
  14. {
  15. [Fact]
  16. public void ShouldRetrieveValues()
  17. {
  18. var jira = TestableJira.Create();
  19. string json = File.ReadAllText("IssueJSON.txt");
  20. var issue = Issue.FromJson(jira, json);
  21. Assert.Equal(2, issue.AffectsVersions.Count);
  22. Assert.True(issue.AffectsVersions.Any(v => v.Name.Equals("1.0")));
  23. Assert.Equal("admin", issue.Assignee);
  24. Assert.Equal(2, issue.Components.Count);
  25. Assert.True(issue.Components.Any(v => v.Name.Equals("server")));
  26. Assert.Equal("2012/04/24", issue.Created.Value.ToString("yyyy/MM/dd"));
  27. Assert.Equal(1, issue.CustomFields.Count);
  28. Assert.Equal("foobar", issue.CustomFields[0].Values[0]);
  29. Assert.Equal("Sample Description", issue.Description);
  30. Assert.Null(issue.DueDate);
  31. Assert.Equal("Sample Environment", issue.Environment);
  32. Assert.Equal(2, issue.FixVersions.Count);
  33. Assert.True(issue.FixVersions.Any(v => v.Name.Equals("1.0")));
  34. Assert.Same(jira, issue.Jira);
  35. Assert.Equal("TST-1", issue.Key);
  36. Assert.Equal("3", issue.Priority.Id);
  37. Assert.Equal("TST", issue.Project);
  38. Assert.Equal("admin", issue.Reporter);
  39. Assert.Null(issue.Resolution);
  40. Assert.Equal("1", issue.Status.Id);
  41. Assert.Equal("There can be only one", issue.Summary);
  42. Assert.Equal("1", issue.Type.Id);
  43. Assert.Equal("2012/04/24", issue.Updated.Value.ToString("yyyy/MM/dd"));
  44. Assert.Equal(0, issue.Votes);
  45. }
  46. }
  47. public class Constructor
  48. {
  49. [Fact]
  50. public void ShouldSetDefaultValues()
  51. {
  52. var issue = CreateIssue("ProjectKey");
  53. Assert.Equal(0, issue.AffectsVersions.Count);
  54. Assert.Null(issue.Assignee);
  55. Assert.Equal(0, issue.Components.Count);
  56. Assert.Null(issue.Created);
  57. Assert.Equal(0, issue.CustomFields.Count);
  58. Assert.Null(issue.Description);
  59. Assert.Null(issue.DueDate);
  60. Assert.Null(issue.Environment);
  61. Assert.Null(issue.Key);
  62. Assert.Null(issue.Priority);
  63. Assert.Equal("ProjectKey", issue.Project);
  64. Assert.Null(issue.Reporter);
  65. Assert.Null(issue.Resolution);
  66. Assert.Null(issue.Status);
  67. Assert.Null(issue.Summary);
  68. Assert.Null(issue.Type);
  69. Assert.Null(issue.Updated);
  70. Assert.Null(issue.Votes);
  71. }
  72. [Fact]
  73. public void FromRemote_ShouldPopulateFields()
  74. {
  75. var remoteIssue = new RemoteIssue()
  76. {
  77. affectsVersions = new RemoteVersion[] { new RemoteVersion() { id = "remoteVersion" } },
  78. assignee = "assignee",
  79. components = new RemoteComponent[] { new RemoteComponent() { id = "remoteComponent" } },
  80. created = new DateTime(2011, 1, 1),
  81. customFieldValues = new RemoteCustomFieldValue[] { new RemoteCustomFieldValue() { customfieldId = "customField" } },
  82. description = "description",
  83. duedate = new DateTime(2011, 3, 3),
  84. environment = "environment",
  85. fixVersions = new RemoteVersion[] { new RemoteVersion() { id = "remoteFixVersion" } },
  86. key = "key",
  87. priority = "priority",
  88. project = "project",
  89. reporter = "reporter",
  90. resolution = "resolution",
  91. status = "status",
  92. summary = "summary",
  93. type = "type",
  94. updated = new DateTime(2011, 2, 2),
  95. votes = 1
  96. };
  97. var issue = remoteIssue.ToLocal();
  98. Assert.Equal(1, issue.AffectsVersions.Count);
  99. Assert.Equal("assignee", issue.Assignee);
  100. Assert.Equal(1, issue.Components.Count);
  101. Assert.Equal(new DateTime(2011, 1, 1), issue.Created);
  102. Assert.Equal(1, issue.CustomFields.Count);
  103. Assert.Equal("description", issue.Description);
  104. Assert.Equal(new DateTime(2011, 3, 3), issue.DueDate);
  105. Assert.Equal("environment", issue.Environment);
  106. Assert.Equal("key", issue.Key.Value);
  107. Assert.Equal("priority", issue.Priority.Id);
  108. Assert.Equal("project", issue.Project);
  109. Assert.Equal("reporter", issue.Reporter);
  110. Assert.Equal("resolution", issue.Resolution.Id);
  111. Assert.Equal("status", issue.Status.Id);
  112. Assert.Equal("summary", issue.Summary);
  113. Assert.Equal("type", issue.Type.Id);
  114. Assert.Equal(new DateTime(2011, 2, 2), issue.Updated);
  115. Assert.Equal(1, issue.Votes);
  116. }
  117. }
  118. public class ToRemote
  119. {
  120. [Fact]
  121. public void IfFieldsNotSet_ShouldLeaveFieldsNull()
  122. {
  123. var issue = CreateIssue("ProjectKey");
  124. var remoteIssue = issue.ToRemote();
  125. Assert.Null(remoteIssue.affectsVersions);
  126. Assert.Null(remoteIssue.assignee);
  127. Assert.Null(remoteIssue.components);
  128. Assert.Null(remoteIssue.created);
  129. Assert.Null(remoteIssue.customFieldValues);
  130. Assert.Null(remoteIssue.description);
  131. Assert.Null(remoteIssue.duedate);
  132. Assert.Null(remoteIssue.environment);
  133. Assert.Null(remoteIssue.key);
  134. Assert.Null(remoteIssue.priority);
  135. Assert.Equal("ProjectKey", remoteIssue.project);
  136. Assert.Null(remoteIssue.reporter);
  137. Assert.Null(remoteIssue.resolution);
  138. Assert.Null(remoteIssue.status);
  139. Assert.Null(remoteIssue.summary);
  140. Assert.Null(remoteIssue.type);
  141. Assert.Null(remoteIssue.updated);
  142. Assert.Null(remoteIssue.votes);
  143. }
  144. [Fact]
  145. public void IfFieldsSet_ShouldPopulateFields()
  146. {
  147. var issue = CreateIssue("ProjectKey");
  148. var version = new RemoteVersion().ToLocal();
  149. var component = new RemoteComponent().ToLocal();
  150. issue.AffectsVersions.Add(version);
  151. issue.Assignee = "assignee";
  152. issue.Components.Add(component);
  153. // issue.CustomFields <-- requires extra setup, test below
  154. issue.Description = "description";
  155. issue.DueDate = new DateTime(2011, 1, 1);
  156. issue.Environment = "environment";
  157. issue.FixVersions.Add(version);
  158. // issue.Key <-- should be non-settable
  159. issue.Priority = "1";
  160. // issue.Project <-- should be non-settable
  161. issue.Reporter = "reporter";
  162. issue.Summary = "summary";
  163. issue.Type = "4";
  164. issue.Votes = 1;
  165. var remoteIssue = issue.ToRemote();
  166. Assert.Equal(1, remoteIssue.affectsVersions.Length);
  167. Assert.Equal("assignee", remoteIssue.assignee);
  168. Assert.Equal(1, remoteIssue.components.Length);
  169. Assert.Null(remoteIssue.created);
  170. //Assert.Equal(remoteIssue.customFieldValues);
  171. Assert.Equal("description", remoteIssue.description);
  172. Assert.Equal(new DateTime(2011, 1, 1), remoteIssue.duedate);
  173. Assert.Equal("environment", remoteIssue.environment);
  174. Assert.Null(remoteIssue.key);
  175. Assert.Equal("1", remoteIssue.priority);
  176. Assert.Equal("ProjectKey", remoteIssue.project);
  177. Assert.Equal("reporter", remoteIssue.reporter);
  178. Assert.Null(remoteIssue.resolution);
  179. Assert.Null(remoteIssue.status);
  180. Assert.Equal("summary", remoteIssue.summary);
  181. Assert.Equal("4", remoteIssue.type);
  182. Assert.Null(remoteIssue.updated);
  183. Assert.Equal(1, remoteIssue.votes);
  184. }
  185. [Fact]
  186. public void ToRemote_IfTypeSetByName_FetchId()
  187. {
  188. var jira = TestableJira.Create();
  189. var issue = jira.CreateIssue("ProjectKey");
  190. jira.SoapService.Setup(s => s.GetIssueTypes(It.IsAny<string>(), It.IsAny<string>()))
  191. .Returns(new RemoteIssueType[]{
  192. new RemoteIssueType() { id = "1", name = "Bug"}});
  193. issue.Type = "Bug";
  194. var remoteIssue = issue.ToRemote();
  195. Assert.Equal("1", remoteIssue.type);
  196. }
  197. }
  198. public class GetUpdatedFields
  199. {
  200. [Fact]
  201. public void IfJiraNamedPropertyWithId_ReturnField()
  202. {
  203. var issue = CreateIssue();
  204. issue.Type = "5";
  205. var result = GetUpdatedFieldsForIssue(issue);
  206. Assert.Equal(1, result.Length);
  207. Assert.Equal("5", result[0].values[0]);
  208. }
  209. [Fact]
  210. public void IfJiraNamedPropertyWithName_ReturnsFieldWithIdInferred()
  211. {
  212. var jira = TestableJira.Create();
  213. jira.SoapService.Setup(s => s.GetIssueTypes(It.IsAny<string>(), It.IsAny<string>()))
  214. .Returns(new RemoteIssueType[]{
  215. new RemoteIssueType() { id ="2", name="Task" }
  216. });
  217. var issue = jira.CreateIssue("FOO");
  218. issue.Type = "Task";
  219. var result = GetUpdatedFieldsForIssue(issue);
  220. Assert.Equal(1, result.Length);
  221. Assert.Equal("2", result[0].values[0]);
  222. }
  223. [Fact]
  224. public void IfJiraNamedPropertyWithNameNotChanged_ReturnsNoFieldsChanged()
  225. {
  226. var jira = TestableJira.Create();
  227. jira.SoapService.Setup(s => s.GetIssueTypes(It.IsAny<string>(), It.IsAny<string>()))
  228. .Returns(new RemoteIssueType[]{
  229. new RemoteIssueType() { id ="5", name="Task" }
  230. });
  231. var remoteIssue = new RemoteIssue()
  232. {
  233. type = "5",
  234. };
  235. var issue = remoteIssue.ToLocal(jira);
  236. issue.Type = "Task";
  237. Assert.Equal(0, GetUpdatedFieldsForIssue(issue).Length);
  238. }
  239. [Fact]
  240. public void ReturnEmptyIfNothingChanged()
  241. {
  242. var issue = CreateIssue();
  243. Assert.Equal(0, GetUpdatedFieldsForIssue(issue).Length);
  244. }
  245. [Fact]
  246. public void IfString_ReturnOneFieldThatChanged()
  247. {
  248. var issue = CreateIssue();
  249. issue.Summary = "foo";
  250. Assert.Equal(1, GetUpdatedFieldsForIssue(issue).Length);
  251. }
  252. [Fact]
  253. public void IfString_ReturnAllFieldsThatChanged()
  254. {
  255. var issue = CreateIssue();
  256. issue.Summary = "foo";
  257. issue.Description = "foo";
  258. issue.Assignee = "foo";
  259. issue.Environment = "foo";
  260. issue.Reporter = "foo";
  261. issue.Type = "2";
  262. issue.Resolution = "3";
  263. issue.Priority = "4";
  264. Assert.Equal(8, GetUpdatedFieldsForIssue(issue).Length);
  265. }
  266. [Fact]
  267. public void IfStringEqual_ReturnNoFieldsThatChanged()
  268. {
  269. var remoteIssue = new RemoteIssue()
  270. {
  271. summary = "Summary"
  272. };
  273. var issue = remoteIssue.ToLocal();
  274. issue.Summary = "Summary";
  275. Assert.Equal(0, GetUpdatedFieldsForIssue(issue).Length);
  276. }
  277. [Fact]
  278. public void IfComparableEqual_ReturnNoFieldsThatChanged()
  279. {
  280. var remoteIssue = new RemoteIssue()
  281. {
  282. priority = "5",
  283. };
  284. var issue = remoteIssue.ToLocal();
  285. issue.Priority = "5";
  286. Assert.Equal(0, GetUpdatedFieldsForIssue(issue).Length);
  287. }
  288. [Fact]
  289. public void IfComparable_ReturnsFieldsThatChanged()
  290. {
  291. var issue = CreateIssue();
  292. issue.Priority = "5";
  293. Assert.Equal(1, GetUpdatedFieldsForIssue(issue).Length);
  294. }
  295. [Fact]
  296. public void IfDateTimeChanged_ReturnsFieldsThatChanged()
  297. {
  298. var issue = CreateIssue();
  299. issue.DueDate = new DateTime(2011, 10, 10);
  300. var fields = GetUpdatedFieldsForIssue(issue);
  301. Assert.Equal(1, fields.Length);
  302. Assert.Equal("10/Oct/11", fields[0].values[0]);
  303. }
  304. [Fact]
  305. public void IfDateTimeUnChangd_ShouldNotIncludeItInFieldsThatChanged()
  306. {
  307. var remoteIssue = new RemoteIssue()
  308. {
  309. duedate = new DateTime(2011, 1, 1)
  310. };
  311. var issue = remoteIssue.ToLocal();
  312. Assert.Equal(0, GetUpdatedFieldsForIssue(issue).Length);
  313. }
  314. [Fact]
  315. public void IfComponentsAdded_ReturnsFields()
  316. {
  317. var issue = new RemoteIssue() { key = "foo" }.ToLocal();
  318. var component = new RemoteComponent() { id = "1", name = "1.0" };
  319. issue.Components.Add(component.ToLocal());
  320. var fields = GetUpdatedFieldsForIssue(issue);
  321. Assert.Equal(1, fields.Length);
  322. Assert.Equal("components", fields[0].id);
  323. Assert.Equal("1", fields[0].values[0]);
  324. }
  325. [Fact]
  326. public void IfAddFixVersion_ReturnAllFieldsThatChanged()
  327. {
  328. var issue = new RemoteIssue() { key = "foo" }.ToLocal();
  329. var version = new RemoteVersion() { id = "1", name = "1.0" };
  330. issue.FixVersions.Add(version.ToLocal());
  331. var fields = GetUpdatedFieldsForIssue(issue);
  332. Assert.Equal(1, fields.Length);
  333. Assert.Equal("fixVersions", fields[0].id);
  334. Assert.Equal("1", fields[0].values[0]);
  335. }
  336. [Fact]
  337. public void IfAddAffectsVersion_ReturnAllFieldsThatChanged()
  338. {
  339. var issue = new RemoteIssue() { key = "foo" }.ToLocal();
  340. var version = new RemoteVersion() { id = "1", name = "1.0" };
  341. issue.AffectsVersions.Add(version.ToLocal());
  342. var fields = GetUpdatedFieldsForIssue(issue);
  343. Assert.Equal(1, fields.Length);
  344. Assert.Equal("versions", fields[0].id);
  345. Assert.Equal("1", fields[0].values[0]);
  346. }
  347. }
  348. public class GetAttachments
  349. {
  350. [Fact]
  351. public void IfIssueNotCreated_ShouldThrowException()
  352. {
  353. var issue = CreateIssue();
  354. Assert.Throws(typeof(InvalidOperationException), () => issue.GetAttachments());
  355. }
  356. [Fact]
  357. public void IfIssueIsCreated_ShouldLoadAttachments()
  358. {
  359. //arrange
  360. var jira = TestableJira.Create();
  361. jira.SoapService.Setup(j => j.GetAttachmentsFromIssue(TestableJira.Token, "key"))
  362. .Returns(new RemoteAttachment[1] { new RemoteAttachment() { filename = "attach.txt" } });
  363. var issue = (new RemoteIssue() { key = "key" }).ToLocal(jira);
  364. //act
  365. var attachments = issue.GetAttachments();
  366. //assert
  367. Assert.Equal(1, attachments.Count);
  368. Assert.Equal("attach.txt", attachments[0].FileName);
  369. }
  370. }
  371. public class AddAttachment
  372. {
  373. [Fact]
  374. public void AddAttachment_IfIssueNotCreated_ShouldThrowAnException()
  375. {
  376. var issue = CreateIssue();
  377. Assert.Throws(typeof(InvalidOperationException), () => issue.AddAttachment("foo", new byte[] { 1 }));
  378. }
  379. [Fact]
  380. public void AddAttachment_IfIssueCreated_ShouldUpload()
  381. {
  382. //arrange
  383. var jira = TestableJira.Create();
  384. jira.FileSystem.Setup(f => f.FileReadAllBytes("foo.txt")).Returns(new byte[] { 1, 2, 3 });
  385. var issue = (new RemoteIssue() { key = "key" }).ToLocal(jira);
  386. //act
  387. issue.AddAttachment("foo.txt");
  388. //assert
  389. jira.SoapService.Verify(j => j.AddBase64EncodedAttachmentsToIssue(
  390. "token",
  391. "key",
  392. new string[] { "foo.txt" },
  393. new string[] { "AQID" }));
  394. }
  395. }
  396. public class AddLabels
  397. {
  398. [Fact]
  399. public void IfIssueNotCreated_ShouldThrowAnException()
  400. {
  401. var issue = CreateIssue();
  402. Assert.Throws(typeof(InvalidOperationException), () => issue.AddLabels());
  403. }
  404. }
  405. public class WorkflowTransition
  406. {
  407. [Fact]
  408. public void IfIssueNotCreated_ShouldThrowAnException()
  409. {
  410. var issue = CreateIssue();
  411. Assert.Throws(typeof(InvalidOperationException), () => issue.WorkflowTransition("foo"));
  412. }
  413. [Fact]
  414. public void IfTransitionNotFound_ShouldThrowAnException()
  415. {
  416. var jira = TestableJira.Create();
  417. var issue = (new RemoteIssue() { key = "key" }).ToLocal(jira);
  418. Assert.Throws(typeof(InvalidOperationException), () => issue.WorkflowTransition("foo"));
  419. }
  420. [Fact]
  421. public void CallsProgressWorkflowAction()
  422. {
  423. var jira = TestableJira.Create();
  424. var issue = (new RemoteIssue() { key = "key" }).ToLocal(jira);
  425. jira.SoapService.Setup(s => s.GetAvailableActions(It.IsAny<string>(), "key"))
  426. .Returns(new RemoteNamedObject[1] { new RemoteNamedObject() { id = "123", name = "action" } });
  427. jira.SoapService.Setup(s => s.ProgressWorkflowAction(It.IsAny<string>(), "key", "123", It.IsAny<RemoteFieldValue[]>()))
  428. .Returns(new RemoteIssue() { status = "456" });
  429. issue.WorkflowTransition("action");
  430. Assert.Equal("456", issue.Status.Id);
  431. }
  432. }
  433. public class GetComments
  434. {
  435. [Fact]
  436. public void IfIssueNotCreated_ShouldThrowException()
  437. {
  438. var issue = CreateIssue();
  439. Assert.Throws(typeof(InvalidOperationException), () => issue.GetComments());
  440. }
  441. [Fact]
  442. public void IfIssueIsCreated_ShouldLoadComments()
  443. {
  444. //arrange
  445. var jira = TestableJira.Create();
  446. jira.SoapService.Setup(j => j.GetCommentsFromIssue(TestableJira.Token, "key"))
  447. .Returns(new RemoteComment[1] { new RemoteComment() { body = "the comment" } });
  448. var issue = (new RemoteIssue() { key = "key" }).ToLocal(jira);
  449. //act
  450. var comments = issue.GetComments();
  451. //assert
  452. Assert.Equal(1, comments.Count);
  453. Assert.Equal("the comment", comments[0].Body);
  454. }
  455. }
  456. public class AddComment
  457. {
  458. [Fact]
  459. public void IfIssueNotCreated_ShouldThrowAnException()
  460. {
  461. var issue = CreateIssue();
  462. Assert.Throws(typeof(InvalidOperationException), () => issue.AddComment("foo"));
  463. }
  464. [Fact]
  465. public void IfIssueCreated_ShouldUpload()
  466. {
  467. //arrange
  468. var jira = TestableJira.Create();
  469. var issue = (new RemoteIssue() { key = "key" }).ToLocal(jira);
  470. //act
  471. issue.AddComment("the comment");
  472. //assert
  473. jira.SoapService.Verify(j => j.AddComment(
  474. "token",
  475. "key",
  476. It.Is<RemoteComment>(r => r.body == "the comment" && r.author == "user")));
  477. }
  478. }
  479. public class DeleteWorklog
  480. {
  481. [Fact]
  482. public void IfIssueNotCreated_ShouldThrownAnException()
  483. {
  484. var issue = CreateIssue();
  485. Assert.Throws(typeof(InvalidOperationException), () => issue.DeleteWorklog(null));
  486. }
  487. }
  488. public class AddWorklog
  489. {
  490. [Fact]
  491. public void IfIssueNotCreated_ShouldThrowAnException()
  492. {
  493. var issue = CreateIssue();
  494. Assert.Throws(typeof(InvalidOperationException), () => issue.AddWorklog("foo"));
  495. }
  496. [Fact]
  497. public void WithWorklogObject_ShouldCallServiceToCreateLog()
  498. {
  499. var jira = TestableJira.Create();
  500. var work = new Worklog("1m", DateTime.Now) { Comment = "comment" };
  501. var issue = (new RemoteIssue() { key = "key" }).ToLocal(jira);
  502. var result = issue.AddWorklog(work);
  503. jira.SoapService.Verify(j => j.AddWorklogAndAutoAdjustRemainingEstimate(
  504. It.IsAny<string>(),
  505. "key",
  506. It.Is<RemoteWorklog>(l => l.timeSpent == "1m" && l.comment == "comment")));
  507. }
  508. [Fact]
  509. public void ShouldCallServiceToAddWorkLog()
  510. {
  511. var jira = TestableJira.Create();
  512. var issue = (new RemoteIssue() { key = "key" }).ToLocal(jira);
  513. //act
  514. var result = issue.AddWorklog("1d");
  515. //assert
  516. jira.SoapService.Verify(j => j.AddWorklogAndAutoAdjustRemainingEstimate(
  517. It.IsAny<string>(),
  518. "key",
  519. It.Is<RemoteWorklog>(l => l.timeSpent == "1d")));
  520. }
  521. [Fact]
  522. public void IfRetainRemainingEstimate_ShouldAddWorkLog()
  523. {
  524. var jira = TestableJira.Create();
  525. var remoteWorkLog = new RemoteWorklog() { id = "12345" };
  526. jira.SoapService.Setup(s => s.AddWorklogAndRetainRemainingEstimate(
  527. It.IsAny<string>(), It.IsAny<string>(), It.IsAny<RemoteWorklog>())).Returns(remoteWorkLog);
  528. var issue = (new RemoteIssue() { key = "key" }).ToLocal(jira);
  529. //act
  530. var result = issue.AddWorklog("1d", WorklogStrategy.RetainRemainingEstimate);
  531. //assert
  532. Assert.Equal("12345", result.Id);
  533. jira.SoapService.Verify(j => j.AddWorklogAndRetainRemainingEstimate(
  534. "token",
  535. "key",
  536. It.Is<RemoteWorklog>(l => l.timeSpent == "1d")));
  537. }
  538. [Fact]
  539. public void IfNewRemainingEstimate_ShouldAddWorkLog()
  540. {
  541. var jira = TestableJira.Create();
  542. var remoteWorkLog = new RemoteWorklog() { id = "12345" };
  543. jira.SoapService.Setup(s => s.AddWorklogWithNewRemainingEstimate(
  544. It.IsAny<string>(), It.IsAny<string>(), It.IsAny<RemoteWorklog>(), It.IsAny<string>())).Returns(remoteWorkLog);
  545. var issue = (new RemoteIssue() { key = "key" }).ToLocal(jira);
  546. //act
  547. var result = issue.AddWorklog("1d", WorklogStrategy.NewRemainingEstimate, "5d");
  548. //assert
  549. Assert.Equal("12345", result.Id);
  550. jira.SoapService.Verify(j => j.AddWorklogWithNewRemainingEstimate(
  551. "token",
  552. "key",
  553. It.Is<RemoteWorklog>(l => l.timeSpent == "1d"),
  554. "5d"));
  555. }
  556. }
  557. public class GetWorklogs
  558. {
  559. [Fact]
  560. public void ShouldGetWorklogsFromServer()
  561. {
  562. var jira = TestableJira.Create();
  563. var logs = new RemoteWorklog[] { new RemoteWorklog() { id = "12345" } };
  564. jira.SoapService.Setup(s => s.GetWorkLogs(It.IsAny<string>(), "111")).Returns(logs);
  565. var issue = (new RemoteIssue() { key = "111" }).ToLocal(jira);
  566. var result = issue.GetWorklogs();
  567. Assert.Equal("12345", result.First().Id);
  568. }
  569. [Fact]
  570. public void IfIssueNotCreated_ShouldThrowException()
  571. {
  572. var issue = new Issue(TestableJira.Create(), "project");
  573. Assert.Throws(typeof(InvalidOperationException), () => issue.GetWorklogs());
  574. }
  575. }
  576. public class Refresh
  577. {
  578. [Fact]
  579. public void Refresh_IfIssueNotCreated_ShouldThrowAnException()
  580. {
  581. var issue = CreateIssue();
  582. Assert.Throws(typeof(InvalidOperationException), () => issue.Refresh());
  583. }
  584. }
  585. private static Issue CreateIssue(string project = "TST")
  586. {
  587. return TestableJira.Create().CreateIssue(project);
  588. }
  589. private static RemoteFieldValue[] GetUpdatedFieldsForIssue(Issue issue)
  590. {
  591. return ((IRemoteIssueFieldProvider)issue).GetRemoteFields();
  592. }
  593. }
  594. }