Beispiel #1
0
        public void AccountValidTest1()
        {
            #region arrange (驗證帳號失敗)

            // 輸入的帳號
            AccountInfoData accountID = new AccountInfoData()
            {
                UserId = 1, AccountName = "kevan", Password = "******", UserName = "******"
            };

            ExecuteResult reExcuteResult = new ExecuteResult()
            {
                IsSuccessed = false, Message = "該帳號不存在。"
            };

            _loginBO.Stub(o => o.AccountValid(Arg <AccountInfoData> .Is.Anything)).Return(reExcuteResult);

            #endregion

            #region act

            var result = _target.AccountValid(accountID);

            #endregion

            #region assert

            Assert.AreEqual(result.Message, reExcuteResult.Message);

            #endregion
        }
Beispiel #2
0
        public void AccountValidTest1()
        {
            #region arrange (驗證帳號失敗)

            // 輸入的帳號
            AccountInfoData accountID = new AccountInfoData()
            {
                UserId = 1, AccountName = "kevan", Password = "******", UserName = "******"
            };

            List <UserDTO> reUserDTOList = new List <UserDTO>()
            {
            };

            string reMessage = "該帳號不存在。";

            _userEfRepo.Stub(o => o.FindAccountName(Arg <string> .Is.Anything)).Return(reUserDTOList);

            #endregion

            #region act

            var result = _target.AccountValid(accountID);

            #endregion

            #region assert

            Assert.AreEqual(result.Message, reMessage);

            #endregion
        }
Beispiel #3
0
        public void GetUserDataByAccountNameTest()
        {
            #region arrange

            AccountInfoData accountID = new AccountInfoData()
            {
                UserId = 1, AccountName = "kevan", Password = "******", UserName = "******"
            };

            UserDTO reUserDTO = new UserDTO()
            {
                UserID = 1, AccountName = "kevan", Password = "******", UserName = "******", Email = "*****@*****.**"
            };

            _loginBO.Stub(o => o.GetUserDataByAccountName(Arg <AccountInfoData> .Is.Anything)).Return(reUserDTO);

            #endregion

            #region act

            var result = _target.GetUserDataByAccountName(accountID);

            #endregion

            #region assert

            Assert.AreEqual(result.UserID, reUserDTO.UserID);
            Assert.AreEqual(result.AccountName, reUserDTO.AccountName);
            Assert.AreEqual(result.Password, reUserDTO.Password);
            Assert.AreEqual(result.UserName, reUserDTO.UserName);
            Assert.AreEqual(result.Email, reUserDTO.Email);

            #endregion
        }
Beispiel #4
0
        /// <summary>
        /// 驗證登入帳號密碼
        /// </summary>
        /// <param name="accountInfoData"></param>
        /// <returns></returns>
        public ExecuteResult AccountValid(AccountInfoData accountInfoData)
        {
            ExecuteResult result = new ExecuteResult();

            try
            {
                result.IsSuccessed = _userEfRepo.FindAccountName(accountInfoData.AccountName).Any();
                //驗證帳號
                if (!result.IsSuccessed)
                {
                    result.Message = "該帳號不存在。";
                    return(result);
                }

                string key = ConfigurationManager.AppSettings["EncryptKey"] == null ? "1qaz@WSX" : ConfigurationManager.AppSettings["EncryptKey"];

                accountInfoData.Password = AESEncryptHelper.AESEncryptBase64(accountInfoData.Password, key);

                result.IsSuccessed = _userEfRepo.FindAccountData(accountInfoData.AccountName).Password == accountInfoData.Password;
                //驗證密碼
                if (!result.IsSuccessed)
                {
                    result.Message = "密碼輸入錯誤。";
                }
            }
            catch (Exception ex)
            {
                result.IsSuccessed = false;
                result.Message     = ex.Message;
            }

            return(result);
        }
Beispiel #5
0
        public ActionResult Login(AccountInfoData accountInfoData)
        {
            ExecuteResult result = new ExecuteResult();

            if (!ModelState.IsValid)
            {
                CurrentHttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                accountInfoData.Message = "請填寫必填欄位";
                return(View(accountInfoData));
            }
            else
            {
                result = _loginService.AccountValid(accountInfoData);
                if (!result.IsSuccessed)
                {
                    CurrentHttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                    accountInfoData.Message = result.Message;
                    return(View(accountInfoData));
                }
                else
                {
                    UserDTO         user          = _loginService.GetUserDataByAccountName(accountInfoData);
                    SecurityLevel   securityLevel = new SecurityLevel();
                    AccountInfoData userInfoData  = new AccountInfoData()
                    {
                        UserId      = user.UserID,
                        AccountName = accountInfoData.AccountName
                    };

                    securityLevel.UserData     = userInfoData;
                    securityLevel.SecurityRole = _loginService.GetRoleDataByUserID(user.UserID.ToString()).ToList();

                    securityLevel.SecurityUrl.AddRange(_securityService.GetSecurityRoleFunction(securityLevel.UserData.UserId.ToString()));


                    CurrentSecurityLevel = securityLevel;
                    CurrentHttpContext.Session["UserName"]    = user.UserName;
                    CurrentHttpContext.Session["UserID"]      = user.UserID;
                    CurrentHttpContext.Session["AccountName"] = user.AccountName;

                    // UnitTest用
                    //if (HttpContext == null)
                    //{
                    //    CurrentHttpContext.Session[AccountInfoData.LoginInfo] = securityLevel;
                    //    CurrentHttpContext.Session["UserName"] = user.UserName;
                    //}
                    //else
                    //{
                    //    SessionConnectionPool.SetCurrentUserInfo(securityLevel);
                    //    Session["UserName"] = user.UserName;
                    //}

                    return(RedirectToAction("Index", "Home"));
                }
            }
        }
Beispiel #6
0
        /// <summary>
        /// 刷新權限Sesstion
        /// </summary>
        public void SessionReflash()
        {
            SecurityLevel   securityLevel = new SecurityLevel();
            AccountInfoData userInfoData  = new AccountInfoData()
            {
                UserId      = Convert.ToInt32(CurrentHttpContext.Session["UserID"]),
                AccountName = CurrentHttpContext.Session["AccountName"].ToString()
            };

            securityLevel.UserData     = userInfoData;
            securityLevel.SecurityRole = _loginService.GetRoleDataByUserID(CurrentHttpContext.Session["UserID"].ToString()).ToList();

            securityLevel.SecurityUrl.AddRange(_securityService.GetSecurityRoleFunction(securityLevel.UserData.UserId.ToString()));

            CurrentSecurityLevel = securityLevel;
        }
        public ActionResult Login(AccountInfoData accountInfoData)
        {
            ExecuteResult result = new ExecuteResult();

            if (!ModelState.IsValid)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                result.IsSuccessed  = false;
                result.Message      = "請填寫必填欄位";
                return(Json(result, JsonRequestBehavior.AllowGet));
            }
            else
            {
                result = _loginService.AccountValid(accountInfoData);
                if (!result.IsSuccessed)
                {
                    Response.StatusCode = (int)HttpStatusCode.BadRequest;
                    return(Json(result, JsonRequestBehavior.AllowGet));
                }
                else
                {
                    UserDTO         user          = _loginService.GetUserDataByAccountName(accountInfoData);
                    SecurityLevel   securityLevel = new SecurityLevel();
                    AccountInfoData userInfoData  = new AccountInfoData()
                    {
                        UserId      = user.UserID,
                        AccountName = accountInfoData.AccountName,
                        UserName    = accountInfoData.UserName
                    };
                    securityLevel.UserData     = userInfoData;
                    securityLevel.SecurityRole = _loginService.GetRoleDataByUserID(user.UserID.ToString()).ToList();

                    foreach (var item in securityLevel.SecurityRole)
                    {
                        securityLevel.SecurityUrl.AddRange(_securityService.GetSecurityRoleFunction(item.RoleID.ToString()));
                    }

                    SessionConnectionPool.SetCurrentUserInfo(securityLevel);

                    Session["UserName"] = user.UserName;
                    Response.StatusCode = (int)HttpStatusCode.OK;
                    return(Json(securityLevel, JsonRequestBehavior.AllowGet));
                    //return Redirect("http://localhost:4200/");
                }
            }
        }
        public void LoginTest2()
        {
            #region arrange (登入失敗)

            // httpContext物件設定
            var httpContext = FakeHttpContextManager.CreateHttpContextBase();
            httpContext.Response.StatusCode = 200;

            // 輸入參數 登入資訊
            AccountInfoData accountInfoData = new AccountInfoData()
            {
                AccountName = "Jon",
                Password    = "******"
            };

            // 輸出參數 驗證後結果
            ExecuteResult reExcuteResult = new ExecuteResult()
            {
                IsSuccessed = false,
                Message     = "該帳號不存在。"
            };

            // 驗證帳號密碼
            _loginService.Stub(o => o.AccountValid(Arg <AccountInfoData> .Is.Anything)).Return(reExcuteResult);

            // 設定httpContext
            _target.CurrentHttpContext = httpContext;

            #endregion

            #region act

            var result = _target.Login(accountInfoData) as ViewResult;

            #endregion

            #region assert

            // 驗證資料
            Assert.AreEqual(((AccountInfoData)result.Model).AccountName, accountInfoData.AccountName);
            Assert.AreEqual(((AccountInfoData)result.Model).Password, accountInfoData.Password);
            Assert.AreEqual(((AccountInfoData)result.Model).Message, reExcuteResult.Message);

            #endregion
        }
Beispiel #9
0
        public void AccountValidTest()
        {
            #region arrange (驗證成功)

            // 輸入的帳號
            AccountInfoData accountID = new AccountInfoData()
            {
                UserId = 1, AccountName = "kevan", Password = "******", UserName = "******"
            };

            List <UserDTO> reUserDTOList = new List <UserDTO>()
            {
                new UserDTO()
                {
                    UserID = 1, AccountName = "kevan", Password = "******", UserName = "******", Email = "*****@*****.**"
                }
            };

            UserDTO reUserDTO = new UserDTO()
            {
                UserID = 1, AccountName = "kevan", Password = "******", UserName = "******", Email = "*****@*****.**"
            };

            string reMessage = accountID.Message;

            _userEfRepo.Stub(o => o.FindAccountName(Arg <string> .Is.Anything)).Return(reUserDTOList);

            _userEfRepo.Stub(o => o.FindAccountData(Arg <string> .Is.Anything)).Return(reUserDTO);

            #endregion

            #region act

            var result = _target.AccountValid(accountID);

            #endregion

            #region assert

            Assert.AreEqual(result.Message, reMessage);

            #endregion
        }
Beispiel #10
0
 private void OnAccountInfoUpdateDelegate(AccountInfoData acctInfoData)
 {
     Debug.WriteLine(acctInfoData.dAvailable);
     if (UIDispatcher != null)
     {
         UIDispatcher.BeginInvoke(new Action(delegate
         {
             Available      = acctInfoData.dAvailable;
             Balance        = acctInfoData.dBalance;
             CurrMargin     = acctInfoData.dCurrMargin;
             Commission     = acctInfoData.dCommission;
             FrozenMargin   = acctInfoData.dFrozenMargin;
             FrozenCash     = acctInfoData.dFrozenCash;
             CloseProfit    = acctInfoData.dCloseProfit;
             PositionProfit = acctInfoData.dPositionProfit;
             UpdateTime     = DateTime.Now;
         }));
     }
 }
Beispiel #11
0
 /// <summary>
 /// 透過帳號名稱取得帳號資料
 /// </summary>
 /// <param name="accountInfoData"></param>
 /// <returns></returns>
 public UserDTO GetUserDataByAccountName(AccountInfoData accountInfoData)
 {
     return(_loginBO.GetUserDataByAccountName(accountInfoData));
 }
Beispiel #12
0
 /// <summary>
 /// 驗證登入帳號密碼
 /// </summary>
 /// <param name="accountInfoData"></param>
 /// <returns></returns>
 public ExecuteResult AccountValid(AccountInfoData accountInfoData)
 {
     return(_loginBO.AccountValid(accountInfoData));
 }
Beispiel #13
0
 /// <summary>
 /// 透過帳號名稱取得帳號資料
 /// </summary>
 /// <param name="accountInfoData"></param>
 /// <returns></returns>
 public UserDTO GetUserDataByAccountName(AccountInfoData accountInfoData)
 {
     return(_userEfRepo.FindAccountData(accountInfoData.AccountName));
 }
    public GetAccountInfoResult GetAccountInfo(String Request)
    {
        GetAccountInfoResult getAccountInfoResult = new GetAccountInfoResult();
        String ReturnCode = "";
        String Descriptioin = "";
        StringBuilder Response = new StringBuilder();
        Response.AppendFormat("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        #region
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(Request);
        XmlNode versionNode = xmlDoc.SelectNodes("/root/callinfo/version")[0];
        String version = versionNode.Attributes["value"].Value;

        XmlNode SPIDNode = xmlDoc.SelectNodes("/root/callinfo/SPID")[0];
        String SPID = SPIDNode.Attributes["value"].Value;

        XmlNode CustIDNode = xmlDoc.SelectNodes("/root/srchcond/conds/CUSTID")[0];
        String CustID = CustIDNode.Attributes["value"].Value;

        XmlNode BesttoneAccountNode = xmlDoc.SelectNodes("/root/srchcond/conds/BesttoneAccount")[0];
        String BA = BesttoneAccountNode.Attributes["value"].Value;
        #endregion

        int Result = 0;
        String ErrMsg = "";

        StringBuilder strLog = new StringBuilder();
        try
        {
            #region 条件校验
            if (CommonUtility.IsEmpty(SPID))
            {
                ReturnCode = Convert.ToString(ErrorDefinition.CIP_IError_Result_SPIDInValid_Code);
                Descriptioin = ErrorDefinition.CIP_IError_Result_SPIDInValid_Msg;
                Response.AppendFormat("<result returnCode = {0} msg = {1} />", ReturnCode, Descriptioin);
                //return Response.ToString();
                getAccountInfoResult.ReturnCode = Convert.ToString(ErrorDefinition.CIP_IError_Result_SPIDInValid_Code);
                getAccountInfoResult.Msg = ErrorDefinition.CIP_IError_Result_SPIDInValid_Msg;
                return getAccountInfoResult;
            }

            //IP是否允许访问
            Result = CommonBizRules.CheckIPLimit(SPID, HttpContext.Current.Request.UserHostAddress, this.Context, out ErrMsg);
            strLog.AppendFormat("请求方ip:{0}\r\n", HttpContext.Current.Request.UserHostAddress);
            strLog.AppendFormat("CheckIPLimit Result:{0},ErrMsg:{1}\r\n", Result, ErrMsg);
            if (Result != 0)
            {
                ReturnCode = Convert.ToString(ErrorDefinition.BT_IError_Result_BizIPLimit_Code);
                Descriptioin = ErrorDefinition.BT_IError_Result_BizIPLimit_Msg;
                //Response.AppendFormat("<result returnCode = {0} msg = {1} />", ReturnCode, Descriptioin);
                //return Response.ToString();
                getAccountInfoResult.ReturnCode = Convert.ToString(ErrorDefinition.BT_IError_Result_BizIPLimit_Code);
                getAccountInfoResult.Msg = ErrorDefinition.BT_IError_Result_BizIPLimit_Msg;
                return getAccountInfoResult;
            }

            //接口访问权限判断
            Result = CommonBizRules.CheckInterfaceLimit(SPID, "GetAccountInfo", this.Context, out ErrMsg);
            strLog.AppendFormat("CheckInterfaceLimit Result:{0},ErrMsg:{1}\r\n", Result, ErrMsg);
            if (Result != 0)
            {
                //return Result;
                ReturnCode = Convert.ToString(ErrorDefinition.BT_IError_Result_BizInterfaceLimit_Code);
                Descriptioin = ErrorDefinition.BT_IError_Result_BizInterfaceLimit_Msg;
                Response.AppendFormat("<result returnCode = {0} msg = {1} />", ReturnCode, Descriptioin);
                //return Response.ToString();
                getAccountInfoResult.ReturnCode = ReturnCode;
                getAccountInfoResult.Msg = Descriptioin;
                return getAccountInfoResult;
            }

            if (CommonUtility.IsEmpty(CustID) && CommonUtility.IsEmpty(BA))
            {
                ReturnCode = Convert.ToString(ErrorDefinition.BT_IError_Result_BizInterfaceLimit_Code);
                Descriptioin = "CustID和BesttoneAccount不能同时为空!";
                Response.AppendFormat("<result returnCode = {0} msg = {1} />", ReturnCode, Descriptioin);
                //return Response.ToString();
                getAccountInfoResult.ReturnCode = ReturnCode;
                getAccountInfoResult.Msg = Descriptioin;
                return getAccountInfoResult;
            }
            BesttoneAccount account = null;
            BesttoneAccountDAO dao = new BesttoneAccountDAO();

            if (!CommonUtility.IsEmpty(CustID))
            {
                account = dao.QueryByCustID(CustID);
            }

            if (!CommonUtility.IsEmpty(BA))
            {
                account = dao.QueryByBestAccount(BA);
            }

            if (account == null)
            {
                ReturnCode = Convert.ToString(ErrorDefinition.BT_IError_Result_BizInterfaceLimit_Code);
                Descriptioin = "账户不存在!";
                Response.AppendFormat("<result returnCode = {0} msg = {1} />", ReturnCode, Descriptioin);
                //return Response.ToString();
                getAccountInfoResult.ReturnCode = ReturnCode;
                getAccountInfoResult.Msg = Descriptioin;
                return getAccountInfoResult;
            }

            //查询账户余额
            AccountItem item;
            Result = BesttoneAccountHelper.QueryBesttoneAccount(account.BestPayAccount, out item, out ErrMsg);
            if (Result == 0)
            {
                AccountInfoData data = new AccountInfoData();
                getAccountInfoResult.ReturnCode = "0";
                getAccountInfoResult.Msg = "成.功";
                data.Id = "";
                data.CustID = account.CustID;
                data.BesttoneAccount = account.BestPayAccount;
                data.AccountType = item.AccountType;
                data.AccountStatus = item.AccountStatus;
                data.AccountBalance = item.AccountBalance;
                data.PredayBalance = item.PredayBalance;
                data.PremonthBalance = item.PreMonthBalance;
                data.AvailableBalance = item.AvailableBalance;
                data.UnavailableBalance = item.UnAvailableBalance;
                data.AvailableCash = item.AvailableLecash;
                data.CardNum = item.CardNum;
                data.CardType = item.CardType;
                getAccountInfoResult.data = data;
                //Response.AppendFormat("<Result returnCode = \"0\" msg = \"成功\">");
                //Response.AppendFormat("<Data ID = \"\">");
                //Response.AppendFormat("<CUSTID>{0}</CUSTID>", account.CustID);
                //Response.AppendFormat("<BESTTONEACCOUNT>{0}</BESTTONEACCOUNT>", account.BestPayAccount);
                //Response.AppendFormat("<ACCOUNTTYPE>{0}</ACCOUNTTYPE>", item.AccountType);

                //Response.AppendFormat("<ACCOUNTSTATUS>{0}</ACCOUNTSTATUS>", item.AccountStatus);
                //Response.AppendFormat("<ACCOUNTBALANCE>{0}</ACCOUNTBALANCE>", item.AvailableBalance);
                //Response.AppendFormat("<PREDAYBALANCE>{0}</PREDAYBALANCE>", item.PredayBalance);
                //Response.AppendFormat("<PREMONTHBALANCE>{0}</PREMONTHBALANCE>", item.PreMonthBalance);
                //Response.AppendFormat("<AVAILABLEBALANCE>{0}</AVAILABLEBALANCE>", item.AvailableBalance);
                //Response.AppendFormat("<UNAVAILABLEBALANCE>{0}</UNAVAILABLEBALANCE>", item.UnAvailableBalance);
                //Response.AppendFormat("<AVAILABLECASH>{0}</AVAILABLECASH>", item.AvailableLecash);
                //Response.AppendFormat("<CARDNUM>{0}</CARDNUM>", item.CardNum);
                //Response.AppendFormat("<CARDTYPE>{0}</CARDTYPE>", item.CardType);
                //Response.AppendFormat("</Data>");
                //Response.AppendFormat("</Result>");

            }
            else {
                ReturnCode = Convert.ToString(ErrorDefinition.BT_IError_Result_BizInterfaceLimit_Code);
                Descriptioin = "账户查询失败!";
                //Response.AppendFormat("<result returnCode = {0} msg = {1} />", ReturnCode, Descriptioin);
                getAccountInfoResult.ReturnCode = ReturnCode;
                getAccountInfoResult.Msg = Descriptioin;
            }
            #endregion
        }
        catch (Exception e)
        {
            getAccountInfoResult.ReturnCode = "-9001";
            getAccountInfoResult.Msg = e.ToString();
        }
        //return Response.ToString();
        return getAccountInfoResult;
    }
        public void LoginTest1()
        {
            #region arrange (登入成功)

            // httpContext物件設定
            var httpContext = FakeHttpContextManager.CreateHttpContextBase();
            httpContext.Response.StatusCode = 200;

            // 輸入參數
            AccountInfoData accountInfoData = new AccountInfoData()
            {
                AccountName = "kevan",
                Password    = "******"
            };

            // 輸出參數
            ExecuteResult reExcuteResult = new ExecuteResult()
            {
                IsSuccessed = true
            };

            // 透過帳號名稱所取得的帳號資訊
            UserDTO reUserDTO = new UserDTO()
            {
                UserID      = 1,
                AccountName = "kevan",
                Password    = "******",
                UserName    = "******",
                Email       = "*****@*****.**"
            };

            // 透過ID所取得腳色資料包
            List <RoleDTO> reRoleDTOList = new List <RoleDTO>()
            {
                new RoleDTO()
                {
                    RoleID = 1, RoleName = "Admin", Description = "最高權限"
                },
                new RoleDTO()
                {
                    RoleID = 2, RoleName = "A", Description = "A1"
                },
                new RoleDTO()
                {
                    RoleID = 3, RoleName = "B", Description = "B1"
                }
            };

            // 透過ID取得該使用者所有的權限資料包
            List <SecurityRoleFunctionDTO> reSRFRole1 = new List <SecurityRoleFunctionDTO>()
            {
                new SecurityRoleFunctionDTO()
                {
                    Description = "首頁", Url = "Home/Index"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "瀏覽角色管理畫面", Url = "Role/RoleManagement"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "角色新增修改刪除畫面", Url = "Role/RoleAddEditDelete"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "編輯角色", Url = "Role/EditRole"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "編輯角色使用者畫面", Url = "Role/RoleUserEdit"
                }
            };

            List <SecurityRoleFunctionDTO> reSRFRole2 = new List <SecurityRoleFunctionDTO>()
            {
                new SecurityRoleFunctionDTO()
                {
                    Description = "首頁", Url = "Home/Index"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "瀏覽角色管理畫面", Url = "Role/RoleManagement"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "角色新增修改刪除畫面", Url = "Role/RoleAddEditDelete"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "編輯角色", Url = "Role/EditRole"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "編輯角色使用者畫面", Url = "Role/RoleUserEdit"
                }
            };

            List <SecurityRoleFunctionDTO> reSRFRole3 = new List <SecurityRoleFunctionDTO>()
            {
                new SecurityRoleFunctionDTO()
                {
                    Description = "首頁", Url = "Home/Index"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "瀏覽角色管理畫面", Url = "Role/RoleManagement"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "角色新增修改刪除畫面", Url = "Role/RoleAddEditDelete"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "編輯角色", Url = "Role/EditRole"
                },
                new SecurityRoleFunctionDTO()
                {
                    Description = "編輯角色使用者畫面", Url = "Role/RoleUserEdit"
                }
            };

            List <SecurityRoleFunctionDTO> reSRF = new List <SecurityRoleFunctionDTO>();
            reSRF.AddRange(reSRFRole1);
            reSRF.AddRange(reSRFRole2);
            reSRF.AddRange(reSRFRole3);

            // 驗證使用者帳號密碼
            _loginService.Stub(o => o.AccountValid(Arg <AccountInfoData> .Is.Anything)).Return(reExcuteResult);

            // 取得帳號資料
            _loginService.Stub(o => o.GetUserDataByAccountName(Arg <AccountInfoData> .Is.Anything)).Return(reUserDTO);

            // 取得腳色資料包
            _loginService.Stub(o => o.GetRoleDataByUserID(Arg <string> .Is.Anything)).Return(reRoleDTOList);

            // 取得功能權限
            _securityService.Stub(o => o.GetSecurityRoleFunction("1")).Return(reSRFRole1);
            _securityService.Stub(o => o.GetSecurityRoleFunction("2")).Return(reSRFRole2);
            _securityService.Stub(o => o.GetSecurityRoleFunction("3")).Return(reSRFRole3);

            // 設定httpContext
            _target.CurrentHttpContext = httpContext;

            #endregion

            #region act

            var result = _target.Login(accountInfoData) as RedirectToRouteResult;

            #endregion

            #region assert

            // 驗證 Action
            Assert.IsTrue(string.IsNullOrEmpty(result.RouteValues["action"].ToString()) || result.RouteValues["action"].ToString() == "Index");

            // 驗證 Controller
            Assert.IsTrue(string.IsNullOrEmpty(result.RouteValues["controller"].ToString()) || result.RouteValues["controller"].ToString() == "Home");

            // 取得 Session 並驗證
            var sessionInfo = _target.CurrentHttpContext.Session["LoginInfo"] as SecurityLevel;

            // 驗證權限資料
            for (int i = 0; i < sessionInfo.SecurityRole.Count; i++)
            {
                Assert.AreEqual(sessionInfo.SecurityRole[i].RoleID, reRoleDTOList[i].RoleID);
                Assert.AreEqual(sessionInfo.SecurityRole[i].RoleName, reRoleDTOList[i].RoleName);
                Assert.AreEqual(sessionInfo.SecurityRole[i].Description, reRoleDTOList[i].Description);
            }

            for (int i = 0; i < sessionInfo.SecurityUrl.Count; i++)
            {
                Assert.AreEqual(sessionInfo.SecurityUrl[i].Url, reSRF[i].Url);
                Assert.AreEqual(sessionInfo.SecurityUrl[i].Description, reSRF[i].Description);
            }

            Assert.AreEqual(sessionInfo.UserData.UserId, 1);
            Assert.AreEqual(sessionInfo.UserData.AccountName, "kevan");

            Assert.AreEqual(_target.CurrentHttpContext.Session["UserName"], "kevan");

            #endregion
        }