public void ValidOrganizationAndProjectUrlsAreParsedCorrectly(string organizationOrProjectUrl, string expectedOrgUrl, string expectedProjUrl)
        {
            var apu = AdoProjectUrls.ParseOrganizationAndProjectUrls(organizationOrProjectUrl);

            Assert.AreEqual(expectedOrgUrl, apu.OrganizationUrl);
            Assert.AreEqual(expectedProjUrl, apu.ProjectUrl);
        }
Ejemplo n.º 2
0
        public static AzureDevOpsConnection?GetMostQualifiedConnection(this IAzureDevOpsConfigurationStore store, AdoProjectUrls adoProjectUrls)
        {
            var copyList = new List <AzureDevOpsConnection>(store.GetConnections().Select(connection =>
            {
                if (connection.BaseUrl == null)
                {
                    return(connection);
                }

                if (!connection.BaseUrl.EndsWith("/"))
                {
                    connection.BaseUrl += "/";
                }

                return(connection);
            }));

            copyList.Sort((connection1, connection2) =>
            {
                if (connection1.BaseUrl == connection2.BaseUrl)
                {
                    return(0);
                }

                if (connection1.BaseUrl?.Length > connection2.BaseUrl?.Length)
                {
                    return(-1);
                }

                return(1);
            });

            return(copyList.FirstOrDefault(connection =>
            {
                if (connection.BaseUrl == null)
                {
                    return false;
                }

                var baseUrl = new Uri(connection.BaseUrl, UriKind.Absolute);

                var url = adoProjectUrls.ProjectUrl ?? adoProjectUrls.OrganizationUrl;
                if (!url.EndsWith("/"))
                {
                    url += "/";
                }

                return baseUrl.IsBaseOf(new Uri(url, UriKind.Absolute));
            }));
        }
        public Task <IOctoResponseProvider> ExecuteAsync(IOctoRequest request)
        {
            var connectivityCheckResponse = new ConnectivityCheckResponse();

            try
            {
                var requestData = request.GetBody(Data);

                var baseUrl = requestData.BaseUrl;
                // If PersonalAccessToken here is null, it could be that they're clicking the test connectivity button after saving
                // the configuration as we won't have the value of the PersonalAccessToken on client side, so we need to retrieve it
                // from the database
                var personalAccessToken = requestData.PersonalAccessToken.ToSensitiveString();
                if (string.IsNullOrEmpty(personalAccessToken?.Value))
                {
                    personalAccessToken = configurationStore.GetConnections().FirstOrDefault(connection => connection.BaseUrl == baseUrl)?.PersonalAccessToken;
                }

                if (string.IsNullOrEmpty(baseUrl))
                {
                    connectivityCheckResponse.AddMessage(ConnectivityCheckMessageCategory.Error, "Please provide a value for Azure DevOps Base Url.");
                    return(Task.FromResult(Result.Response(connectivityCheckResponse)));
                }

                var urls = AdoProjectUrls.ParseOrganizationAndProjectUrls(baseUrl);
                AdoProjectUrls[] projectUrls;
                if (urls.ProjectUrl != null)
                {
                    projectUrls = new[] { urls };
                }
                else
                {
                    var projectsResult = adoApiClient.GetProjectList(urls, personalAccessToken?.Value);
                    if (projectsResult is FailureResult failure)
                    {
                        connectivityCheckResponse.AddMessage(ConnectivityCheckMessageCategory.Error, failure.ErrorString);
                        return(Task.FromResult(Result.Response(connectivityCheckResponse)));
                    }

                    var projects = (ISuccessResult <string[]>)projectsResult;

                    if (!projects.Value.Any())
                    {
                        connectivityCheckResponse.AddMessage(ConnectivityCheckMessageCategory.Error, "Successfully connected, but unable to find any projects to test permissions.");
                        return(Task.FromResult(Result.Response(connectivityCheckResponse)));
                    }

                    projectUrls = projects.Value.Select(project => new AdoProjectUrls(urls.OrganizationUrl)
                    {
                        ProjectUrl = $"{urls.OrganizationUrl}/{project}"
                    }).ToArray();
                }

                var hasError = false;
                foreach (var projectUrl in projectUrls)
                {
                    var buildScopeTest = adoApiClient.CheckWeCanGetBuilds(projectUrl, personalAccessToken?.Value);
                    if (buildScopeTest is FailureResult buildScopeFailure)
                    {
                        connectivityCheckResponse.AddMessage(ConnectivityCheckMessageCategory.Error, buildScopeFailure.ErrorString);
                        hasError = true;
                    }
                }

                if (!hasError)
                {
                    connectivityCheckResponse.AddMessage(ConnectivityCheckMessageCategory.Info, "Successfully connected to Azure DevOps");

                    if (!configurationStore.GetIsEnabled())
                    {
                        connectivityCheckResponse.AddMessage(ConnectivityCheckMessageCategory.Warning, "The Jira Issue Tracker is not enabled, so its functionality will not currently be available");
                    }
                }

                return(Task.FromResult(Result.Response(connectivityCheckResponse)));
            }
            catch (Exception ex)
            {
                connectivityCheckResponse.AddMessage(ConnectivityCheckMessageCategory.Error, ex.ToString());
                return(Task.FromResult(Result.Response(connectivityCheckResponse)));
            }
        }