private (ApiModule requestApiModule, ApiModule responseApiModule) GetExistingOrCreateNewApiModulePair(
            TCObject objectToExecuteOn,
            XTestStep wseTestStep,
            IWseArtifactsParser wseParser)
        {
            ApiModule requestApiModule  = null;
            ApiModule responseApiModule = null;

            if (!IsModuleSearchCriteriaEmpty(wseParser))
            {
                (requestApiModule, responseApiModule) =
                    CommonUtilities.SearchExistingApiModule(objectToExecuteOn, wseParser, wseTestStep);
            }

            if (requestApiModule != null)
            {
                return(requestApiModule, responseApiModule);
            }

            FolderStructureHandler folderStructureHandler = new FolderStructureHandler();

            (TCFolder apiModuleFolder, string moduleName) =
                folderStructureHandler.CreateFolderForApiModules(objectToExecuteOn, wseTestStep, wseParser);
            return(ApiModuleHandler.CreateApiModulePair(apiModuleFolder, moduleName, wseParser));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Creates request module
        /// </summary>
        /// <param name="moduleFolder">Folder path reference to create Request module</param>
        /// <param name="name">Name of Request module</param>
        /// <param name="wseModuleParser">Contains transport information used to fill in Request Module</param>
        /// <param name="correlationId">Uniquely identify the Request Module</param>
        /// <returns></returns>
        public static ApiModule CreateRequestModule(TCFolder moduleFolder,
                                                    string name,
                                                    IWseArtifactsParser wseModuleParser,
                                                    string correlationId)
        {
            //Module Properties
            ApiModule requestApiModule =
                SetModuleStandardProperties(moduleFolder,
                                            name,
                                            correlationId,
                                            ScanTag.GetRequestScanTag(wseModuleParser));

            //Request Properties
            requestApiModule.AddTechnicalIdParam("Direction", Direction.Out.ToString());
            requestApiModule.AddTechnicalIdParam("InactiveNodes", "Remove");
            requestApiModule.AddTechnicalIdParam("IsRequest", "True");
            requestApiModule.AddTechnicalIdParam("MessagesGenerated", "True");
            requestApiModule.AddConfigurationParam("Executor", "HttpSend");
            requestApiModule.AddTechnicalIdParam("Method", wseModuleParser.Method);
            requestApiModule.AddTechnicalIdParam("Endpoint", wseModuleParser.Endpoint);
            requestApiModule.AddTechnicalIdParam("Resource", wseModuleParser.Resource);
            requestApiModule.AddQueryParams(wseModuleParser.QueryParams);
            requestApiModule.AddPathParams(wseModuleParser.PathParams);
            requestApiModule.AddHeaders(wseModuleParser.Headers);
            if (!string.IsNullOrEmpty(wseModuleParser.RequestPayload))
            {
                requestApiModule.APISetMessagePayload(wseModuleParser.RequestPayload);
            }
            return(requestApiModule);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Creates response module
        /// </summary>
        /// <param name="moduleFolder">Folder path reference to create Response module</param>
        /// <param name="name">Name of Response module</param>
        /// <param name="wseModuleParser">Contains transport information used to fill in Response Module</param>
        /// <param name="correlationId">Uniquely identify the Response Module</param>
        /// <returns></returns>
        public static ApiModule CreateResponseModule(TCFolder moduleFolder,
                                                     string name,
                                                     IWseArtifactsParser wseModuleParser,
                                                     string correlationId
                                                     )
        {
            //tosca specific properties
            ApiModule responseApiModule =
                SetModuleStandardProperties(moduleFolder,
                                            name,
                                            correlationId,
                                            ScanTag.GetResponseScanTag(wseModuleParser));

            responseApiModule.AddTechnicalIdParam("Direction", Direction.In.ToString());
            responseApiModule.AddTechnicalIdParam("InactiveNodes", "Keep");
            responseApiModule.AddTechnicalIdParam("IsRequest", "False");
            responseApiModule.AddConfigurationParam("Executor", "HttpReceive");
            responseApiModule.AddHeaders(wseModuleParser.ResponseHeaders);
            responseApiModule.AddTechnicalIdParam("StatusCode", wseModuleParser.ResponseStatus);
            if (!string.IsNullOrEmpty(wseModuleParser.ResponsePayload))
            {
                responseApiModule.APISetMessagePayload(wseModuleParser.ResponsePayload);
            }
            return(responseApiModule);
        }
        /// <summary>
        /// Creates Module Attribute
        /// </summary>
        /// <param name="apiModule">ApiModule</param>
        /// <param name="name"> Name of the Module Attribute</param>
        /// <param name="valueRange">ValueRange of the Module Attribute</param>
        /// <param name="value">Default value of the Module Attribute</param>
        /// <param name="pathType">pathType of the Module Attribute</param>
        /// <param name="path">path of the Module Attribute</param>
        /// <param name="actionMode">Default ActionMode of the Module Attribute</param>
        /// <param name="dataType">Data Type of the Module Attribute</param>
        /// <returns>Module Attribute</returns>
        public static XModuleAttribute CreateModuleAttribute(this ApiModule apiModule,
                                                             string name,
                                                             string valueRange,
                                                             string value,
                                                             string pathType,
                                                             string path,
                                                             XTestStepActionMode actionMode =
                                                             XTestStepActionMode.Verify,
                                                             ModuleAttributeDataType dataType =
                                                             ModuleAttributeDataType.String)
        {
            XModuleAttribute xModuleAttribute =
                apiModule.CreateModuleAttribute();

            xModuleAttribute.Name         = name;
            xModuleAttribute.DefaultValue = value;
            if (!string.IsNullOrEmpty(valueRange))
            {
                xModuleAttribute.ValueRange = valueRange;
            }
            xModuleAttribute.EnsureUniqueName();
            xModuleAttribute.AddXParamToModuleAttribute("PathType", pathType, ParamTypeE.TechnicalID);
            xModuleAttribute.AddXParamToModuleAttribute("Path", path, ParamTypeE.TechnicalID);
            xModuleAttribute.AddXParamToModuleAttribute("ExplicitName", "True", ParamTypeE.Configuration);
            xModuleAttribute.DefaultActionMode = actionMode;
            xModuleAttribute.DefaultDataType   = dataType;
            return(xModuleAttribute);
        }
 /// <summary>
 /// Add HTTP Headers to API Module
 /// </summary>
 /// <param name="apiModule">API Module</param>
 /// <param name="headers">Dictionary of headers to be added</param>
 public static void AddHeaders(this ApiModule apiModule, Dictionary <string, string> headers)
 {
     foreach (KeyValuePair <string, string> header in headers)
     {
         apiModule.APIAddMessageHeader(header.Key, header.Value);
     }
 }
 /// <summary>
 /// Add params of type Path to the Params section in tosca
 /// </summary>
 /// <param name="apiModule">API Module</param>
 /// <param name="pathParams">Dictionary of Path params to be added</param>
 public static void AddPathParams(this ApiModule apiModule, Dictionary <string, string> pathParams)
 {
     foreach (KeyValuePair <string, string> pathParam in pathParams)
     {
         apiModule.APIAddMessageParameter(pathParam.Key, pathParam.Value, "Path");
     }
 }
Exemplo n.º 7
0
        public void ProcessRequest(HttpContext context)
        {
            string moduleId = context.Request["module_id"];

            if (string.IsNullOrEmpty(moduleId))
            {
                apiResp.msg  = "module_id为必填项,请检查";
                apiResp.code = (int)BLLJIMP.Enums.APIErrCode.IsNotFound;
                bllApi.ContextResponse(context, apiResp);
                return;
            }
            ApiModule model = bllApi.GetApiModule(int.Parse(moduleId));

            if (model == null)
            {
                apiResp.msg  = "模块不存在";
                apiResp.code = (int)BLLJIMP.Enums.APIErrCode.IsNotFound;
                bllApi.ContextResponse(context, apiResp);
                return;
            }
            if (bllApi.Delete(model) > 0)
            {
                apiResp.status = true;
                apiResp.msg    = "ok";
            }
            else
            {
                apiResp.code = (int)BLLJIMP.Enums.APIErrCode.OperateFail;
                apiResp.msg  = "操作出错";
            }
            bllApi.ContextResponse(context, apiResp);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Sets basic authentication properties such as type, username, password and pre-authenticate in API module
        /// </summary>
        /// <param name="apiTestStep">returns module of apiTeststep</param>
        /// <param name="wseTestStep">returns username, password, preauthenticate information of wseTestStep</param>
        public void Execute(XTestStep apiTestStep, XTestStep wseTestStep)
        {
            try {
                FileLogger.Instance.Info("Inside Basic Auth Credentials Migrator");
                string userName        = GetWseUsernameValue(wseTestStep);
                string password        = GetWsePasswordValue(wseTestStep);
                string preAuthenticate = GetWsePreAuthenticateValue(wseTestStep);
                if (!string.IsNullOrEmpty(userName) || !string.IsNullOrEmpty(password) ||
                    !string.IsNullOrEmpty(preAuthenticate))
                {
                    ApiModule apiModule = (ApiModule)apiTestStep.Module;
                    apiModule.AddXParamToModuleAttribute("AuthenticationType", "Basic", ParamTypeE.TechnicalID);
                    apiModule.AddXParamToModuleAttribute("Username", userName, ParamTypeE.TechnicalID);
                    apiModule.AddXParamToModuleAttribute("Password", password, ParamTypeE.TechnicalID);
                    apiModule.AddXParamToModuleAttribute("PreAuthenticate",
                                                         preAuthenticate == "Yes" ? "true" : "false",
                                                         ParamTypeE.TechnicalID);
                }

                FileLogger.Instance.Info("Complete Basic Auth Credentials Migrator");
            }
            catch (Exception ex) {
                FileLogger.Instance.Error(
                    $"Error occurred while migration of Auth Credentials for WSE TestStep : 'Name: {wseTestStep?.Name}' NodePath:'{wseTestStep?.NodePath}' Exception:'{ex.ToString()}'");
            }
        }
Exemplo n.º 9
0
        public void Configuration(IAppBuilder builder)
        {
            this.log.WriteWarning("Configuration started");

            ApiModule.Configure(builder);

            this.log.WriteWarning("Configuration finished");
        }
Exemplo n.º 10
0
        public void Can_Not_Add_Swagger()
        {
            var serviceCollection = new ServiceCollection();
            var apiModule         = new ApiModule(null, new List <string>(), false);

            apiModule.ConfigureServices(serviceCollection);
            serviceCollection.Any(service => service.ServiceType == typeof(ISwaggerProvider)).Should().Be(false);
        }
 /// <summary>
 /// Add params of type Query to the Params section in tosca
 /// </summary>
 /// <param name="apiModule">API Module</param>
 /// <param name="pathParams">Dictionary of query params to be added</param>
 public static void AddQueryParams(this ApiModule apiModule, Dictionary <string, string> queryParams)
 {
     foreach (KeyValuePair <string, string> queryParam in queryParams)
     {
         apiModule.APIAddMessageParameter(queryParam.Key, queryParam.Value, "Query");
     }
     apiModule.AddTechnicalIdParam("QueryParams", string.Join(";", queryParams));
 }
Exemplo n.º 12
0
 private IContainer BuildContainer()
 {
     var builder = new ContainerBuilder();
     var apiModule = new ApiModule();
     builder.RegisterModule(apiModule);
     builder.RegisterApiControllers(apiModule.GetType().Assembly);
     return builder.Build();
 }
 /// <summary>
 /// Creates module attribute for Query params in Api module.
 /// </summary>
 /// <param name="apiModule">apiModule under which module attribute gets created.</param>
 /// <param name="wseTestStepValue">wsetesstep value to set in api module attribute</param>
 /// <returns></returns>
 protected override XModuleAttribute CreateModuleAttribute(ApiModule apiModule,
                                                           KeyValuePair <string, string> wseTestStepValue)
 {
     return(apiModule.CreateModuleAttribute(wseTestStepValue.Key,
                                            String.Empty,
                                            "UrlParam",
                                            $"{wseTestStepValue.Key};Query;0",
                                            XTestStepActionMode.Insert));
 }
Exemplo n.º 14
0
 protected override string GetValueInApiModule(ApiModule apiModule)
 {
     try {
         return(apiModule.GetPropertyValue("Endpoint"));
     }
     catch (Exception) {
         return(string.Empty);
     }
 }
Exemplo n.º 15
0
 /// <summary>
 /// Creates module attribute for response headers.
 /// </summary>
 /// <param name="apiModule">apiModule</param>
 /// <param name="wseTestStepValue">testStepValue of WSE</param>
 /// <returns>returns module attribute</returns>
 protected override XModuleAttribute CreateModuleAttribute(ApiModule apiModule,
                                                           KeyValuePair <string, string> wseTestStepValue)
 {
     return(apiModule.CreateModuleAttribute(
                wseTestStepValue.Key,
                wseTestStepValue.Value,
                wseTestStepValue.Value,
                "Header",
                wseTestStepValue.Key,
                XTestStepActionMode.Insert));
 }
Exemplo n.º 16
0
        private void AssertService(Type type, bool addSwagger = true, bool shouldContain = true)
        {
            if (_apiModule == null)
            {
                _apiModule = new ApiModule(null,
                                           new List <string>(), addSwagger);
                _apiModule.ConfigureServices(_serviceCollection);
            }

            _serviceCollection.Any(service => service.ServiceType == type).Should().Be(shouldContain);
        }
 CreateModuleAttribute(ApiModule apiModule, XTestStepValue wseTestStepValue)
 {
     return(apiModule.CreateModuleAttribute(
                "StatusCode",
                HttpStatusCodeExtension.ValueRange(),
                wseTestStepValue.ModuleAttribute.DefaultValue,
                "StatusCode",
                "StatusCode",
                wseTestStepValue.ModuleAttribute.DefaultActionMode,
                wseTestStepValue.ModuleAttribute.DefaultDataType));
 }
Exemplo n.º 18
0
 CreateModuleAttribute(ApiModule apiModule, XTestStepValue wseTestStepValue)
 {
     return(apiModule.CreateModuleAttribute(
                "Endpoint",
                GetRefinedWseTestStepValue(wseTestStepValue.Value),
                GetRefinedWseTestStepValue(wseTestStepValue.Value),
                "Endpoint",
                "Endpoint",
                wseTestStepValue.ModuleAttribute.DefaultActionMode,
                wseTestStepValue.ModuleAttribute.DefaultDataType));
 }
Exemplo n.º 19
0
        public void ProcessRequest(HttpContext context)
        {
            RequestModel requestModel = new RequestModel();

            try
            {
                requestModel = ZentCloud.Common.JSONHelper.JsonToModel <RequestModel>(context.Request["data"]);
            }
            catch (Exception)
            {
                apiResp.msg  = "JSON格式错误,请检查";
                apiResp.code = (int)BLLJIMP.Enums.APIErrCode.PrimaryKeyIncomplete;
                bllApi.ContextResponse(context, apiResp);
                return;
            }
            if (requestModel.module_id <= 0)
            {
                apiResp.msg  = "module_id参数为必填项,请检查";
                apiResp.code = (int)BLLJIMP.Enums.APIErrCode.IsNotFound;
                bllApi.ContextResponse(context, apiResp);
                return;
            }
            if (string.IsNullOrEmpty(requestModel.module_name))
            {
                apiResp.msg  = "module_name参数为必填项,请检查";
                apiResp.code = (int)BLLJIMP.Enums.APIErrCode.IsNotFound;
                bllApi.ContextResponse(context, apiResp);
                return;
            }
            ApiModule model = bllApi.GetApiModule(requestModel.module_id);

            if (model == null)
            {
                apiResp.msg  = "模块不存在";
                apiResp.code = (int)BLLJIMP.Enums.APIErrCode.IsNotFound;
                bllApi.ContextResponse(context, apiResp);
                return;
            }
            model.ModuleName  = requestModel.module_name;
            model.Description = requestModel.module_desc;
            model.Sort        = requestModel.sort;
            if (bllApi.Update(model))
            {
                apiResp.msg    = "ok";
                apiResp.status = true;
            }
            else
            {
                apiResp.msg  = "操作出错";
                apiResp.code = (int)BLLJIMP.Enums.APIErrCode.OperateFail;
            }
            bllApi.ContextResponse(context, apiResp);
        }
Exemplo n.º 20
0
        private static ApiModule SetModuleStandardProperties(TCFolder moduleFolder,
                                                             string name,
                                                             string correlationId,
                                                             string scanTag)
        {
            ApiModule requestApiModule = moduleFolder.CreateApiModule();

            requestApiModule.Name = name;
            requestApiModule.EnsureUniqueName();
            requestApiModule.AddTechnicalIdParam("CorrelationId", correlationId);
            requestApiModule.AddTechnicalIdParam("Version", AddOnConstants.ToscaVersion);
            requestApiModule.AddConfigurationParam("Engine", "API");
            requestApiModule.AddTechnicalIdParam("ScanTag", scanTag);
            return(requestApiModule);
        }
        /// <summary>
        /// Creates configuration param
        /// </summary>
        /// <param name="module">API Module</param>
        /// <param name="name">Name of the configuration parameter</param>
        /// <param name="value">Value of the configuration parameter</param>
        public static void AddConfigurationParam(this ApiModule module, string name, string value)
        {
            if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(value))
            {
                return;
            }
            XParam newXParam = module.CreateConfigurationParam();

            newXParam.Name      = name;
            newXParam.Value     = value;
            newXParam.ParamType = ParamTypeE.Configuration;
            if (name == "Password")
            {
                newXParam.Visible = false;
            }
        }
Exemplo n.º 22
0
 CreateModuleAttribute(ApiModule apiModule, XTestStepValue wseTestStepValue)
 {
     return(apiModule.CreateModuleAttribute(
                "Method",
                HttpMethodExtension.ValueRangeString(),
                wseTestStepValue
                .ModuleAttribute.DefaultValue,
                "Method",
                "Method",
                wseTestStepValue
                .ModuleAttribute
                .DefaultActionMode,
                wseTestStepValue
                .ModuleAttribute
                .DefaultDataType));
 }
Exemplo n.º 23
0
        public void Can_Add_Api()
        {
            Type[] serviceTypes =
            {
                typeof(ICorsService),
            };

            var serviceCollection = new ServiceCollection();
            var apiModule         = new ApiModule(null, new List <string>(), true);

            apiModule.ConfigureServices(serviceCollection);

            foreach (var serviceType in serviceTypes)
            {
                serviceCollection.Any(service => service.ServiceType == serviceType).Should().Be(true);
            }
        }
 /// <summary>
 /// Creates module attributes for payload
 /// </summary>
 /// <param name="wseTestStepValue">TestStepValues of WSE Teststep</param>
 /// <param name="xpath">XPath and JsonPath for xml</param>
 /// <param name="parent">xModule and xModuleAttribute of ApiEngine</param>
 /// <param name="apiModule">ApiModule</param>
 /// <param name="parentTest">TestStep and TestStepValues for ApiTestStep</param>
 /// <param name="cardinality">Cardinality of WSE XModule</param>
 /// <param name="isArray">True if Wse Xmodule attributes is array</param>
 /// <returns>returns XtestTestValue of API</returns>
 public XTestStepValue CreateModuleAttributeForPayload(XTestStepValue wseTestStepValue,
                                                       string xpath,
                                                       dynamic parent,
                                                       ApiModule apiModule,
                                                       dynamic parentTest,
                                                       string cardinality,
                                                       bool isArray = false)
 {
     return(BusinessParameterHandler.CreateBusinessParameterInTosca(wseTestStepValue,
                                                                    xpath,
                                                                    parent,
                                                                    apiModule,
                                                                    BusinessParameterPathTypes.XPATH,
                                                                    parentTest,
                                                                    cardinality,
                                                                    isArray));
 }
Exemplo n.º 25
0
        public static void AddXParamToModuleAttribute(this ApiModule module,
                                                      string name,
                                                      string value,
                                                      ParamTypeE xParamType)
        {
            var xparam = module.XParams.Where(x => x.Name == name);

            if (xparam == null || !xparam.Any())
            {
                XParam newXParam = module.CreateConfigurationParam();
                newXParam.Name      = name;
                newXParam.Value     = value;
                newXParam.ParamType = xParamType;
                if (name == "Password")
                {
                    newXParam.Visible = false;
                }
            }
        }
Exemplo n.º 26
0
        /// <summary>
        /// Creates request and response module pair
        /// </summary>
        /// <param name="apiModuleFolder">Folder path reference to create Request and Response module</param>
        /// <param name="moduleName">Name of Request and Response module</param>
        /// <param name="wseParser">Contains transport information like Endpoint, Headers, Payload used to fill in Request and Response Module</param>
        /// <returns></returns>
        public static (ApiModule, ApiModule) CreateApiModulePair(TCFolder apiModuleFolder,
                                                                 string moduleName,
                                                                 IWseArtifactsParser wseParser
                                                                 )
        {
            string    correlationId    = Guid.NewGuid().ToString();
            ApiModule requestApiModule =
                CreateRequestModule(apiModuleFolder,
                                    moduleName,
                                    wseParser,
                                    correlationId
                                    );
            ApiModule responseApiModule =
                CreateResponseModule(apiModuleFolder,
                                     $"{moduleName} Response",
                                     wseParser,
                                     correlationId
                                     );

            return(requestApiModule, responseApiModule);
        }
 private XTestStepValue CreateModuleAttributeForPayload(XTestStepValue wseTestStepValue,
                                                        string jsonPath,
                                                        dynamic parent,
                                                        ApiModule apiModule,
                                                        dynamic parentTest,
                                                        string cardinality,
                                                        bool isArray = false)
 {
     if (jsonPath.StartsWith("."))
     {
         jsonPath = jsonPath.Remove(0, 1);
     }
     return(BusinessParameterHandler.CreateBusinessParameterInTosca(wseTestStepValue,
                                                                    jsonPath,
                                                                    parent,
                                                                    apiModule,
                                                                    BusinessParameterPathTypes.JSONPATH,
                                                                    parentTest,
                                                                    cardinality,
                                                                    isArray));
 }
Exemplo n.º 28
0
        protected override string GetValueInApiModule(ApiModule apiModule, string key)
        {
            try {
                if (apiModule?.Headers != null && apiModule.Headers.Length > 0)
                {
                    var l = Deserialize <List <List <KeyValuePair <string, string> > > >(apiModule.Headers);
                    foreach (var keyvaluepairList in l)
                    {
                        var k = keyvaluepairList.First().Value;
                        if (k == key)
                        {
                            return(CommonUtilities.RemoveExtraDoubleQuotes(keyvaluepairList.Last().Value));
                        }
                    }
                }
            }
            catch (Exception) {
                // ignored
            }

            return(string.Empty);
        }
        public async static Task <IContainer> GetContainer(string settingsUrl)
        {
            var reader           = new Lykke.SettingsReader.SettingsServiceReloadingManager <AppSettings <IconApiSettings> >(settingsUrl, (x) => { });
            var reloadingManager = await reader.Reload();

            var apiModule            = new ApiModule <IconApiSettings>(reader);
            var iconApiModule        = new IconApiModule(reader);
            var services             = new ServiceCollection();
            ContainerBuilder builder = new ContainerBuilder();

            services.AddHttpClient();
            builder.
            RegisterInstance(reader)
            .As <IReloadingManager <AppSettings <IconApiSettings> > >()
            .SingleInstance();
            builder.RegisterModule(iconApiModule);
            builder.RegisterModule(apiModule);
            builder.Populate(services);
            var container = builder.Build();

            return(container);
        }
        /// <summary>
        /// Creates technical param in the property section of module
        /// </summary>
        /// <param name="module">API Module</param>
        /// <param name="name">Name of the Technical parameter</param>
        /// <param name="value">Value of the Technical parameter</param>
        /// <param name="visibility">if the param will be visible in the property section</param>
        public static void AddTechnicalIdParam(this ApiModule module,
                                               string name,
                                               string value,
                                               bool visibility = true)
        {
            if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(value))
            {
                return;
            }
            XParam newXParam = module.CreateConfigurationParam();

            newXParam.Name      = name;
            newXParam.Value     = value;
            newXParam.ParamType = ParamTypeE.TechnicalID;
            if (!visibility)
            {
                newXParam.Visible = false;
            }
            if (name == "Password")
            {
                newXParam.Visible = false;
            }
        }
 /// <summary>
 /// Creates an instance of the response.
 /// </summary>
 /// <param name="module">The ApiModule from which the response will be sent.</param>
 /// <param name="message">A human-readable message explaining the error.
 /// If a value of null is supplied for this parameter then a default message will be provided.</param>
 /// <param name="detail">A human-readable message that provides more detail and preferably
 /// some indication of the action that the API consumer should take to remedy the error.
 /// If a value of null is supplied for this parameter then default details will be provided.</param>
 /// <param name="errorCode">An error code unique within the scope of an API's domain.
 /// If a value of null is supplied for this parameter then a default error code will be provided.</param>
 /// <param name="infoUrl">A url where further documentation is provided about the error.
 /// If a value of null is supplied for this parameter then a default url will be provided.</param>
 public UnauthorizedResponse(ApiModule module, string message, string detail,
                             string errorCode, string infoUrl)
     : this(module.Context, message, detail, errorCode, infoUrl)
 {
 }