public void IsValidTest_ValidCallerIdCustomerIdSessionToken_ShouldValidateSuccessfully()
        {
            #region Arrange
            AccessCredentials credential = new AccessCredentials();
            credential.CallerId     = "TestCallerId";
            credential.UserID       = 100;
            credential.SessionToken = "TestSessionToken";
            credential.UseCaseGroup = "SANC";
            DateTime           loginDate = DateTime.UtcNow;
            GetProfileResponse response  = new GetProfileResponse();
            #endregion Arrange

            #region Act
            queryUtilsMock.Setup(x => x.GetHPPToken(It.IsAny <IIdeaDatabaseDataContext>(),
                                                    It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>()))
            .Returns(new UserAuthentication()
            {
                Token = "ReturnedToken", CreatedDate = loginDate
            });

            bool result = credential.IsValid(response);
            #endregion Act

            #region Assert
            Assert.IsTrue(result, "The validation should not have failed as the values provided were valid");
            Assert.IsTrue(response.ErrorList.Count == 0);
            #endregion Assert
        }
        public void IsValidTest_ShouldReturnFaultInvalidCredentials()
        {
            AccessCredentials credential = new AccessCredentials();

            credential.CallerId     = "TestCallerId";
            credential.UserID       = 100;
            credential.SessionToken = "TestSessionToken";

            UserAuthentication nullAuth = null;

            queryUtilsMock.Setup(x => x.GetHPPToken(It.IsAny <IIdeaDatabaseDataContext>(),
                                                    It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>()))
            .Returns(nullAuth);

            GetProfileResponse response = new GetProfileResponse();

            bool result = credential.IsValid(response);

            Assert.IsFalse(result);
            Assert.IsTrue(response.ErrorList.Count == 1);
            Assert.IsTrue(response.ErrorList.ElementAt(0).ReturnCode.Equals(Faults.InvalidCredentials.ReturnCode));
        }
        public void IsValidTest_EmptyCallerIdZeroCustomerIdNullSessionToken_ShouldReturnFaultWithSpecificErrorDetails()
        {
            #region Arrange
            AccessCredentials credential = new AccessCredentials();
            credential.CallerId     = string.Empty;
            credential.UserID       = 0;
            credential.SessionToken = null;
            GetProfileResponse response = new GetProfileResponse();
            #endregion Arrange

            #region Act
            bool result = credential.IsValid(response);
            #endregion Act

            #region Assert
            Assert.IsTrue(!result, "The validation should have failed due to invalid UserName, Password & CallerId");
            Assert.IsTrue(response.ErrorList.Count == 3);

            // Fault object type check
            Fault fault1 = response.ErrorList.ElementAt(0);
            Fault fault2 = response.ErrorList.ElementAt(1);
            Fault fault3 = response.ErrorList.ElementAt(2);

            Assert.IsInstanceOfType(fault1, typeof(ValidationFault), "Wrong fault object type returned");
            Assert.IsInstanceOfType(fault2, typeof(ValidationFault), "Wrong fault object type returned");
            Assert.IsInstanceOfType(fault3, typeof(ValidationFault), "Wrong fault object type returned");

            #region Fault1-UserID
            // Fault properties check
            Assert.IsTrue(string.Equals(fault1.Origin, "InnovationPortal"), "Wrong fault origin returned");
            Assert.IsTrue(string.Equals(fault1.ReturnCode, "FieldValidationError"), "Wrong fault return code returned");
            Assert.IsTrue(string.Equals(fault1.DebugStatusText, "Numeric field value out of bounds"), "Wrong fault status text returned");

            // ValidationFault properties check
            Assert.IsTrue(string.Equals((fault1 as ValidationFault).ErrorType, "Numeric"), "Wrong validation error type returned");
            Assert.IsTrue(string.Equals((fault1 as ValidationFault).FieldName, "UserID"), "Wrong validation field name returned");
            #endregion Fault1-UserID

            #region Fault2-SessionToken
            // Fault properties check
            Assert.IsTrue(string.Equals(fault2.Origin, "InnovationPortal"), "Wrong fault origin returned");
            Assert.IsTrue(string.Equals(fault2.ReturnCode, "FieldValidationError"), "Wrong fault return code returned");
            Assert.IsTrue(string.Equals(fault2.DebugStatusText, "Required field is missing"), "Wrong fault status text returned");

            // ValidationFault properties check
            Assert.IsTrue(string.Equals((fault2 as ValidationFault).ErrorType, "Required"), "Wrong validation error type returned");
            Assert.IsTrue(string.Equals((fault2 as ValidationFault).FieldName, "SessionToken"), "Wrong validation field name returned");
            #endregion Fault2-SessionToken

            #region Fault3-CallerId
            // Fault properties check
            Assert.IsTrue(string.Equals(fault3.Origin, "InnovationPortal"), "Wrong fault origin returned");
            Assert.IsTrue(string.Equals(fault3.ReturnCode, "FieldValidationError"), "Wrong fault return code returned");
            Assert.IsTrue(string.Equals(fault3.DebugStatusText, "Field has wrong length"), "Wrong fault status text returned");

            // ValidationFault properties check
            Assert.IsTrue(string.Equals((fault3 as ValidationFault).ErrorType, "Length"), "Wrong validation error type returned");
            Assert.IsTrue(string.Equals((fault3 as ValidationFault).FieldName, "CallerId"), "Wrong validation field name returned");
            #endregion Fault3-CallerId

            #endregion Assert
        }
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            bool         faultOccured = false;
            ResponseBase r            = new ResponseBase();

            try
            {
                base.OnAuthorization(actionContext);
                if (actionContext.ActionDescriptor.GetCustomAttributes <CredentialsHeaderAttribute>().Count == 0)
                {
                    return;
                }
                string credentialsValue = actionContext.Request.Headers.GetValues("Authorization").ElementAt(0);

                AccessCredentials credentials = new AccessCredentials();
                ParseAuthorizationHeader(credentialsValue, credentials, r);


                if (r.ErrorList.Count > 0)
                {
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, r, GlobalConfiguration.Configuration);
                    faultOccured           = true;

                    return;
                }

                validateUserIdWithToken(r, credentials);

                if (!credentials.IsValid(r))
                {
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, r, GlobalConfiguration.Configuration);
                    faultOccured           = true;

                    return;
                }



                var Controller = actionContext.ControllerContext.Controller as Controllers.RESTAPIControllerBase;
                Controller.UserID       = credentials.UserID;
                Controller.SessionToken = credentials.SessionToken;
                Controller.CallerId     = credentials.CallerId;
                Controller.LanguageCode = credentials.LanguageCode;
                Controller.CountryCode  = credentials.CountryCode;
                Controller.Token        = credentials.Token;
                Controller.LoginDate    = credentials.LoginDate;

                if (credentials.Platform != null)
                {
                    var isPlatformDefined = Enum.IsDefined(typeof(RESTAPIPlatform), credentials.Platform);
                    if (isPlatformDefined)
                    {
                        Controller.ClientPlatform = (RESTAPIPlatform)Enum.Parse(typeof(RESTAPIPlatform), credentials.Platform);
                    }
                    else
                    {
                        Controller.ClientPlatform = RESTAPIPlatform.notsupported;
                    }
                }
                if (r.ErrorList.Count == 0)
                {
                    IsAuthorized(actionContext);
                }


                return;
            }
            catch (Exception)
            {
                r.ErrorList.Add(Faults.InvalidCredentials);
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, r, GlobalConfiguration.Configuration);
                faultOccured           = true;
            }
            finally
            {
                APILogLevel apiLogLevel;
                Enum.TryParse(SettingRepository.Get <string>("LogAPICalls", "None"), out apiLogLevel);
                if (faultOccured)
                {
                    filterUtils.Translation(actionContext);
                    filterUtils.LogIntoAdmLogsTable(actionContext.Request, actionContext.Response, actionContext, null, apiLogLevel, faultOccured, false);
                }
            }
        }