public async Task Valid_Connection_Returns_Changeset_For_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); // YouTrack only records history for changes that are a minute apart. Let's sit and wait before making changes and generating history... await Task.Delay(70000); await service.ApplyCommand(temporaryIssueContext.Issue.Id, "assignee me"); await service.UpdateIssue(temporaryIssueContext.Issue.Id, temporaryIssueContext.Issue.Summary + " (updated)", temporaryIssueContext.Issue.Description + " (updated)"); // Act var result = await service.GetChangeHistoryForIssue(temporaryIssueContext.Issue.Id); // Assert Assert.NotNull(result); Assert.True(result.Any()); // Get an item and check for two common properties (updaterName & updated) var firstChange = result.First(); Assert.True(firstChange.Fields.Count > 0); Assert.True(firstChange.ForField("updaterName") != null); Assert.True(firstChange.ForField("updated") != null); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Deletes_Attachment_For_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); for (var i = 1; i <= 3; i++) { using (var attachmentStream = await TestUtilities.GenerateAttachmentStream("Generated by unit test.")) { await service.AttachFileToIssue(temporaryIssueContext.Issue.Id, $"file-{i}.txt", attachmentStream); } } // Act & Assert var acted = false; var attachments = await service.GetAttachmentsForIssue(temporaryIssueContext.Issue.Id); foreach (var attachment in attachments) { // Act & Assert await service.DeleteAttachmentForIssue(temporaryIssueContext.Issue.Id, attachment.Id); acted = true; } Assert.True(acted); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Updates_Comment_For_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); var commentText = "Test comment " + DateTime.UtcNow.ToString("U"); await service.ApplyCommand(temporaryIssueContext.Issue.Id, "comment", commentText); // Act var acted = false; var comments = await service.GetCommentsForIssue(temporaryIssueContext.Issue.Id); foreach (var comment in comments) { if (string.Equals(comment.Text, commentText, StringComparison.OrdinalIgnoreCase)) { await service.UpdateCommentForIssue(temporaryIssueContext.Issue.Id, comment.Id, commentText + " (updated)"); acted = true; } } // Assert Assert.True(acted); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Returns_Issues() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); await service.ApplyCommand(temporaryIssueContext.Issue.Id, "assignee me"); // Act var result = await service.GetIssues("assignee:me", take : 100); // Assert Assert.NotNull(result); foreach (dynamic issue in result) { Assert.Equal("demo1", issue.Assignee[0].UserName); Assert.NotNull(issue.ProjectShortName); } await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Gets_Attachments_For_Issue() { var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); for (var i = 1; i <= 3; i++) { using (var attachmentStream = await TestUtilities.GenerateAttachmentStream("Generated by unit test.")) { await service.AttachFileToIssue(temporaryIssueContext.Issue.Id, $"file-{i}.txt", attachmentStream); } } // Act var attachments = await service.GetAttachmentsForIssue(temporaryIssueContext.Issue.Id); // Assert Assert.True(attachments.Count() == 3); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Gets_Attachments_For_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); using (var attachmentStream = await TestUtilities.GenerateAttachmentStream("Generated by unit test.")) { await service.AttachFileToIssue(temporaryIssueContext.Issue.Id, $"file1.txt", attachmentStream); } var attachments = await service.GetAttachmentsForIssue(temporaryIssueContext.Issue.Id); // Act & Assert using (var streamReader = new StreamReader(await service.DownloadAttachment(attachments.First().Url))) { var data = await streamReader.ReadToEndAsync(); Assert.Equal("Generated by unit test.", data); } await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Returns_Issue_Links() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext1 = await TemporaryIssueContext.Create(connection, GetType())) using (var temporaryIssueContext2 = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); await service.ApplyCommand(temporaryIssueContext1.Issue.Id, "assignee me"); await service.ApplyCommand(temporaryIssueContext2.Issue.Id, "assignee me relates to " + temporaryIssueContext1.Issue.Id); // Act var result = await service.GetLinksForIssue(temporaryIssueContext1.Issue.Id); // Assert Assert.NotNull(result); foreach (var link in result) { Assert.NotNull(link.InwardType); Assert.NotNull(link.OutwardType); Assert.NotNull(link.TypeName); Assert.NotNull(link.Source); Assert.NotNull(link.Target); } await temporaryIssueContext2.Destroy(); await temporaryIssueContext1.Destroy(); } }
public async Task Valid_Connection_Deletes_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); // Act & Assert await service.DeleteIssue(temporaryIssueContext.Issue.Id); await temporaryIssueContext.Destroy(); } }
public async Task Invalid_Command_Returns_Error() { // Arrange var connection = Connections.Demo1Token; var service = connection.CreateIssuesService(); using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { // Act var exception = await Assert.ThrowsAsync <YouTrackErrorException>(async() => await service.ApplyCommand(temporaryIssueContext.Issue.Id, "gibberish")); // Assert Assert.True(exception.Message.Contains("Command [gibberish] is invalid")); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Attaches_Single_File_To_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); // Act & Assert using (var attachmentStream = await TestUtilities.GenerateAttachmentStream("Generated by unit test.")) { await service.AttachFileToIssue(temporaryIssueContext.Issue.Id, "singlefile.txt", attachmentStream, attachmentContentType : "text/plain"); } await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Creates_Work_Items_For_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateTimeTrackingService(); var workTypes = await service.GetWorkTypesForProject("DP1"); // Act var workItemId = await service.CreateWorkItemForIssue(temporaryIssueContext.Issue.Id, new WorkItem(DateTime.UtcNow, TimeSpan.FromMinutes(5), GetType().FullName, workTypes.First())); // Assert Assert.NotNull(workItemId); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Returns_Issues() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); await service.ApplyCommand(temporaryIssueContext.Issue.Id, "assignee me"); // Act var result = await service.GetIssueCount("assignee:me"); // Assert Assert.True(result > 0); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Returns_Boolean_For_Issue(bool issueExists) { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); // Act var result = issueExists ? await service.Exists(temporaryIssueContext.Issue.Id) : await service.Exists("NOT-EXIST"); // Assert Assert.Equal(issueExists, result); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Updates_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); // Act await service.UpdateIssue(temporaryIssueContext.Issue.Id, temporaryIssueContext.Issue.Summary + " (updated)", temporaryIssueContext.Issue.Description + " (updated)"); // Assert var updatedIssue = await service.GetIssue(temporaryIssueContext.Issue.Id); Assert.Equal(temporaryIssueContext.Issue.Summary + " (updated)", updatedIssue.Summary); Assert.Equal(temporaryIssueContext.Issue.Description + " (updated)", updatedIssue.Description); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Returns_Comments_For_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); await service.ApplyCommand(temporaryIssueContext.Issue.Id, "comment", "New comment on issue"); await service.ApplyCommand(temporaryIssueContext.Issue.Id, "comment", "Another comment on issue"); // Act var result = await service.GetCommentsForIssue(temporaryIssueContext.Issue.Id); // Assert Assert.True(result.Any()); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Applies_Command_To_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); var commentText = "Test comment via command - " + DateTime.UtcNow.ToString("U"); // Act await service.ApplyCommand(temporaryIssueContext.Issue.Id, "comment", commentText); // Assert var issue = await service.GetIssue(temporaryIssueContext.Issue.Id); Assert.True(issue.Comments.Count > 0); Assert.True(issue.Comments.Any(c => string.Equals(c.Text, commentText, StringComparison.OrdinalIgnoreCase))); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Returns_Existing_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); await service.ApplyCommand(temporaryIssueContext.Issue.Id, "Type Bug comment", "This is a test comment."); // Act var result = await service.GetIssue(temporaryIssueContext.Issue.Id); // Assert Assert.NotNull(result); Assert.Equal(temporaryIssueContext.Issue.Id, result.Id); Assert.True(result.Comments.Count > 0); Assert.Equal("Bug", result.AsDynamic().Type[0]); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Gets_Work_Items_For_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateTimeTrackingService(); var workTypes = await service.GetWorkTypesForProject("DP1"); await service.CreateWorkItemForIssue(temporaryIssueContext.Issue.Id, new WorkItem(DateTime.UtcNow, TimeSpan.FromMinutes(5), GetType().FullName, workTypes.First())); await service.CreateWorkItemForIssue(temporaryIssueContext.Issue.Id, new WorkItem(DateTime.UtcNow, TimeSpan.FromMinutes(10), GetType().FullName, workTypes.First())); await service.CreateWorkItemForIssue(temporaryIssueContext.Issue.Id, new WorkItem(DateTime.UtcNow, TimeSpan.FromMinutes(15), GetType().FullName, workTypes.First())); // Act var results = await service.GetWorkItemsForIssue(temporaryIssueContext.Issue.Id); // Assert Assert.True(results.Any()); foreach (var workItem in results) { Assert.NotNull(workItem.Id); Assert.NotNull(workItem.Date); Assert.NotNull(workItem.Duration); Assert.True(workItem.Duration.TotalMinutes > 0); Assert.NotNull(workItem.Description); Assert.NotNull(workItem.WorkType); Assert.NotNull(workItem.Author); Assert.NotNull(workItem.Author.Login); } await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Page_Issues() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateIssuesService(); await service.ApplyCommand(temporaryIssueContext.Issue.Id, "assignee me"); // Act var totalResultsCount = 0; var skip = 0; while (skip < 1000) { var result = await service.GetIssues("assignee: me", skip, take : 100); if (result?.Count > 0) { totalResultsCount += result.Count; } else { break; } skip += 100; } // Assert Assert.True(totalResultsCount > 100); await temporaryIssueContext.Destroy(); } }
public async Task Valid_Connection_Updates_Work_Items_For_Issue() { // Arrange var connection = Connections.Demo1Token; using (var temporaryIssueContext = await TemporaryIssueContext.Create(connection, GetType())) { var service = connection.CreateTimeTrackingService(); var workTypes = await service.GetWorkTypesForProject("DP1"); var originalDescription = GetType().FullName + " " + DateTime.UtcNow.ToString("U"); var workItem = new WorkItem(DateTime.UtcNow, TimeSpan.FromMinutes(5), originalDescription, workTypes.First()); var workItemId = await service.CreateWorkItemForIssue(temporaryIssueContext.Issue.Id, workItem); // Act & Assert workItem.Duration = TimeSpan.FromMinutes(1); workItem.Description = originalDescription + " (edited)"; await service.UpdateWorkItemForIssue(temporaryIssueContext.Issue.Id, workItemId, workItem); await temporaryIssueContext.Destroy(); } }