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();
                }
            }
Example #3
0
            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();
                }
            }
Example #4
0
            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();
                }
            }
Example #5
0
            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();
                }
            }
Example #6
0
            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();
                    }
            }
Example #8
0
            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();
                }
            }
Example #9
0
            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();
                }
            }
Example #11
0
            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();
                }
            }
Example #12
0
            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();
                }
            }
Example #13
0
            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();
                }
            }
Example #14
0
            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();
                }
            }
Example #15
0
            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();
                }
            }
Example #16
0
            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();
                }
            }
Example #17
0
            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();
                }
            }
Example #18
0
            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();
                }
            }
Example #19
0
            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();
                }
            }