public void CheckMultilineExpressionEvaluation()
        {
            // Setup
            var package = new Package <BenderMakesUpdateHimself, Issue>()
            {
                Items = new[] { new Issue
                                {
                                    Key = "T-1"
                                } },
                Reaction = new BenderMakesUpdateHimself
                {
                    UrlPattern  = "http://any",
                    BodyPattern = @" ""datetime"":[{ ""<<c#(

						new System.DateTime(2020, 03, 20) +
						System.TimeSpan.FromDays(
							(new System.DateTime(2020, 03, 20)).Hour < 16 ? 0
							: System.DateTime.Today.DayOfWeek == System.DayOfWeek.Friday ? 3
							: 1
						)
                    )
                    .ToString(""yyyy-MM-dd"")#>>"" }]"
                }
            };
            var converter = new IssuePackageConverter(string.Empty);

            // Experiment
            var result = converter.ToHttpRequests(new[] { package });

            // Check results
            Assert.AreEqual(
                @" ""datetime"":[{ ""2020-03-20"" }]",                               // Expected
                result.Single().Body                                                 // Actual
                );
        }
        public void RedirectionRulesAreCaseInsensitive()
        {
            IPackageSupplier packageSupplier = new JqlSupplier(_jiraService !, _rulesConfig !.GetJqlRules("test-2"), _logger !);
            var message = new IssuePackageConverter("https://jira.express.ship/jira/")
                          .ToMessages(packageSupplier.GetPackages().Cast <Package <BenderSendsLetter, Issue> >())
                          .Redirect(new Redirector(_rulesConfig.GetRedirectionMap(), Enumerable.Empty <string>(), Enumerable.Empty <string>()))
                          .Single();

            Assert.AreEqual("[email protected],[email protected],[email protected]", message.To);
        }
        public void JqlSupplierReplaceMarkersByRealAddresses()
        {
            IPackageSupplier packageSupplier = new JqlSupplier(_jiraService !, _rulesConfig !.GetJqlRules("test"), _logger !);
            var message = new IssuePackageConverter("https://jira.express.ship/jira/")
                          .ToMessages(packageSupplier.GetPackages().Cast <Package <BenderSendsLetter, Issue> >())
                          .Redirect(new Redirector(_rulesConfig.GetRedirectionMap(), Enumerable.Empty <string>(), Enumerable.Empty <string>()))
                          .Single();

            Assert.AreEqual("administrator,[email protected],[email protected]", message.To);
            Assert.AreEqual("*****@*****.**", message.Cc);
        }
        public void CheckThatMessagesSentToMaintainerWhenSupervisorIsAbsent()
        {
            Message?message   = null;
            var     messenger = new Mock <IMessenger>();

            messenger
            .Setup(m => m.SendAll(It.IsAny <IEnumerable <Message> >()))
            .Callback <IEnumerable <Message> >(m => message = m.Single());

            var pipe = new ReactionPipe <Issue>()
            {
                PackageSupplier  = new JqlSupplier(_jiraService !, _rulesConfig !.GetJqlRules("test-for-empty-addressers"), _logger !),
                PackageConverter = new IssuePackageConverter("https://jira.example.com"),
                Redirector       = new Redirector(_rulesConfig.GetRedirectionMap(), Enumerable.Empty <string>(), new[] { "maintainer" }),
                Messenger        = messenger.Object
            };

            pipe.Run();

            Assert.AreEqual("maintainer", message?.To);
            Assert.AreEqual(string.Empty, message?.Cc);
        }
        public void CheckThatSupervisorInCcIsNotDuplicated()
        {
            Message?message   = null;
            var     messenger = new Mock <IMessenger>();

            messenger
            .Setup(m => m.SendAll(It.IsAny <IEnumerable <Message> >()))
            .Callback <IEnumerable <Message> >(m => message = m.Single());

            var pipe = new ReactionPipe <Issue>()
            {
                PackageSupplier  = new JqlSupplier(_jiraService !, _rulesConfig !.GetJqlRules("supervisor-in-Cc"), _logger !),
                PackageConverter = new IssuePackageConverter("https://jira.example.com"),
                Redirector       = new Redirector(_rulesConfig.GetRedirectionMap(), new[] { "supervisor" }, Enumerable.Empty <string>()),
                Messenger        = messenger.Object
            };

            pipe.Run();

            Assert.AreEqual("anybody", message?.To);
            Assert.AreEqual("supervisor", message?.Cc);
        }
        public void FairedSupervisorInAddressees()
        {
            Message?message   = null;
            var     messenger = new Mock <IMessenger>();

            messenger
            .Setup(m => m.SendAll(It.IsAny <IEnumerable <Message> >()))
            .Callback <IEnumerable <Message> >(m => message = m.Single());

            var pipe = new ReactionPipe <Issue>()
            {
                PackageSupplier  = new JqlSupplier(_jiraService !, _rulesConfig !.GetJqlRules("faired-suprevisor-in-addressees"), _logger !),
                PackageConverter = new IssuePackageConverter("https://jira.example.com"),
                Redirector       = new Redirector(_rulesConfig.GetRedirectionMap(), new[] { "faired_supervisor" }, Enumerable.Empty <string>()),
                Messenger        = messenger.Object
            };

            pipe.Run();

            Assert.AreEqual("*****@*****.**", message !.To);
            Assert.AreEqual("faired_supervisor", message !.Cc);
        }
    }
        public void CheckExpressionsEvaluationInUrlAndBody()
        {
            // Setup
            var package = new Package <BenderMakesUpdateHimself, Issue>()
            {
                Items = new[] { new Issue
                                {
                                    Key = "T-1"
                                } },
                Reaction = new BenderMakesUpdateHimself
                {
                    UrlPattern  = "{{@jiraRoot}}/rest/api/<<c# \"{{@jiraRoot}}\".Contains(\"jiraeu\") ? \"2\" : \"1\" #>>/issue/{{@issueKey}}/transitions",
                    BodyPattern = "datetime: \"<<c# new System.DateTime(2019, 03, 18).ToString(\"yyyy-MM-dd\") #>>\""
                }
            };
            var converter1 = new IssuePackageConverter("http://jiraeu");
            var converter2 = new IssuePackageConverter("http://jira");

            // Experiment
            var result1 = converter1.ToHttpRequests(new[] { package });
            var result2 = converter2.ToHttpRequests(new[] { package });

            // Check results
            Assert.AreEqual(
                "http://jiraeu/rest/api/2/issue/T-1/transitions",                   // Expected
                result1.Single().Uri.ToString()                                     // Actual
                );
            Assert.AreEqual(
                "http://jira/rest/api/1/issue/T-1/transitions",                     // Expected
                result2.Single().Uri.ToString()                                     // Actual
                );

            Assert.AreEqual(
                "datetime: \"2019-03-18\"",                                         // Expected
                result1.Single().Body                                               // Actual
                );
        }
        public void CheckSeveralExpressionsToEvaluateInOneBody()
        {
            // Setup
            var converter = new IssuePackageConverter("https://jira.example.com");

            var package = new Package <BenderMakesUpdateHimself, Issue>
            {
                // JQL: issueFunction in issueFieldMatch('', labels, 'linkTo=')
                Items = new[]
                {
                    new Issue
                    {
                        Key    = "BUG-2",
                        Labels = "linkTo=TASK-1",
                    }
                },

                Reaction = new BenderMakesUpdateHimself
                {
                    UrlPattern  = "{{@jiraRoot}}/rest/api/2/issue/{{@issueKey}}",
                    BodyPattern = @"
{
    ""update"": {
        ""issueLinks"": [
            {
                ""add"": {
                    ""type"": {
                        ""name"": ""Relate""
                    },
                    ""outwardIssue"": {
                        ""key"": ""<<c# System.Text.RegularExpressions.Regex.Match(issue.Labels, ""linkTo=(.+-\\d+)"").Groups[1].Value #>>""
                    }
                }
            }
        ],
        ""labels"": [
            {
                ""remove"": ""<<c# System.Text.RegularExpressions.Regex.Match(issue.Labels, ""linkTo=.+-\\d+"").Value #>>""
            }
        ]
    }
}
"
                }
            };

            // Experiment
            var actualRequest = converter.ToHttpRequests(new[] { package }).Single();

            // Check results
            var expectedUrl  = "https://jira.example.com/rest/api/2/issue/BUG-2";
            var expectedBody = @"
{
    ""update"": {
        ""issueLinks"": [
            {
                ""add"": {
                    ""type"": {
                        ""name"": ""Relate""
                    },
                    ""outwardIssue"": {
                        ""key"": ""TASK-1""
                    }
                }
            }
        ],
        ""labels"": [
            {
                ""remove"": ""linkTo=TASK-1""
            }
        ]
    }
}
";

            Assert.AreEqual(expectedUrl, actualRequest.Uri.ToString());
            Assert.AreEqual(expectedBody, actualRequest.Body);
        }