public static void AppendPathSegment_ValidUrlTrailingSlashAppendedWithSegment_ValidlyAppendedResult()
        {
            // arrange
            var baseUrl             = "http://myurl/";
            var uri                 = new Uri(baseUrl);
            var pathSegmentToAdd    = "myController";
            var expectedAbsoluteUri = baseUrl + pathSegmentToAdd;

            // act
            var actualUri = uri.AppendPathSegment(pathSegmentToAdd);

            // assert
            var actualAbsoluteUri = actualUri.AbsoluteUri;

            Assert.Equal(expectedAbsoluteUri, actualAbsoluteUri);
        }
        public static void AppendPathSegment_ValidUrlNoTrailingSlashAppendedWithSegmentTwice_ValidlyAppendedResult()
        {
            // arrange
            var baseUrl             = "http://myurl";
            var uri                 = new Uri(baseUrl);
            var pathSegmentToAddOne = "myController";
            var pathSegmentToAddTwo = "myAction";
            var expectedAbsoluteUri = baseUrl + "/" + pathSegmentToAddOne + "/" + pathSegmentToAddTwo;

            // act
            var actualUri = uri.AppendPathSegment(pathSegmentToAddOne).AppendPathSegment(pathSegmentToAddTwo);

            // assert
            var actualAbsoluteUri = actualUri.AbsoluteUri;

            Assert.Equal(expectedAbsoluteUri, actualAbsoluteUri);
        }
 /// <summary>
 /// Builds the access token URI.
 /// </summary>
 /// <returns>A <see cref="Uri"/> for the access token Uri.</returns>
 public static Uri BuildAccessTokenUri() => baseUri.AppendPathSegment("/oauth/v1/token");
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            var project    = "dummyProject"; // sample project
            var pipelineId = "54";           // sample pipeline id

            log.LogInformation("C# HTTP trigger function processed a request.");

            // get content as string
            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            // parse string as json
            var payload = JsonDocument.Parse(requestBody);
            // get property values from json
            var eventKey         = payload.RootElement.GetProperty("eventKey").GetString();
            var date             = payload.RootElement.GetProperty("date").GetString();
            var actorDisplayName = payload.RootElement.GetProperty("actor").GetProperty("displayName").GetString();

            // iterate array
            foreach (var change in payload.RootElement.GetProperty("changes").EnumerateArray())
            {
                var refId = change.GetProperty("ref").GetProperty("id").GetString();
                Console.WriteLine($"ref.id={refId}");
                var fromHash = change.GetProperty("fromHash").GetString();
                Console.WriteLine($"fromHash = {fromHash}");
            }
            // find first array entry of type branch
            var branchRefId = payload.RootElement
                              .GetProperty("changes").EnumerateArray().First(c => c.GetProperty("ref").GetProperty("type").GetString() == "BRANCH")
                              .GetProperty("ref")
                              .GetProperty("id")
                              .GetString();

            // Debug output
            Console.WriteLine($"eventKey = {eventKey}");
            Console.WriteLine($"date = {date}");
            Console.WriteLine($"actor.DisplayName={actorDisplayName}");

            // POST https://dev.azure.com/{organization}/{project}/_apis/pipelines/{pipelineId}/runs?pipelineVersion={pipelineVersion}&api-version=6.1-preview.1
            // Request URL: https://dev.azure.com/pocit/17a631d0-df12-498b-a172-99a8a6855662/_apis/pipelines/54/runs


            // create payload request - here simple string, better: create class and pass object as .PostJsonAsync(object)
            var postPayload = $"{{\"stagesToSkip\":[],\"resources\":{{\"repositories\":{{\"self\":{{\"refName\":\"{branchRefId}\"}}}}}},\"variables\":{{}}}}";

            // trigger pipeline for specific branch
            // see https://docs.microsoft.com/en-us/rest/api/azure/devops/pipelines/runs/run%20pipeline?view=azure-devops-rest-6.1
            var pipelineTrigger = await _organizationUrl
                                  .AppendPathSegment(project)
                                  .AppendPathSegment($"_apis/pipelines/{pipelineId}/runs")
                                  .WithBasicAuth(string.Empty, _pat)
                                  .WithHeader("Content-Type", "application/json")
                                  .AllowAnyHttpStatus()
                                  .SetQueryParam("api-version", _apiVersion)
                                  .PostStringAsync(postPayload);

            if (pipelineTrigger.ResponseMessage.IsSuccessStatusCode)
            {
                return(new OkObjectResult($"Triggered pipeline {pipelineId} successfully on branch {branchRefId}"));
            }
            else
            {
                return(new BadRequestObjectResult($"Trigger Pipeline {pipelineId} failed, reason {pipelineTrigger.ResponseMessage.StatusCode} {pipelineTrigger.ResponseMessage.ReasonPhrase}"));
            }
        }