Example #1
0
        private async void GetBlockMethodReturnsOkResponse()
        {
            //Arrange
            string         data           = Guid.NewGuid().ToString();
            EncryptService encryptService = new EncryptService();
            string         encryptedPass  = encryptService.EncryptData("1111");
            User           user           = new User("Dimitry", "Sukalo", encryptedPass);

            Block    genesisBlock = new Block();
            UserFile userFile     = new UserFile(data, data, new byte[1]);
            Block    block        = new Block(userFile, user, genesisBlock);

            Mock <IQueryable <Block> > blocks = new List <Block>()
            {
                genesisBlock,
                block
            }.AsQueryable().BuildMock();
            Mock <DbSet <Block> > blockMock = new Mock <DbSet <Block> >();

            SetSettingsInDb(blockMock, blocks);

            Mock <IQueryable <User> > users = new List <User>()
            {
                user
            }.AsQueryable().BuildMock();

            Mock <DbSet <User> > usersMock = new Mock <DbSet <User> >();

            SetSettingsInDb(usersMock, users);

            Mock <BlockChainContext> db = new Mock <BlockChainContext>();

            db.Setup(m => m.Blocks).Returns(blockMock.Object);
            db.Setup(m => m.Users).Returns(usersMock.Object);

            Mock <UserManager <User> > userManagerMock = new Mock <UserManager <User> >(new Mock <IUserStore <User> >().Object,
                                                                                        null, null, null, null, null, null, null, null);

            Mock <IHttpContextAccessor> _contextAccessor = new Mock <IHttpContextAccessor>();

            Mock <IUserClaimsPrincipalFactory <User> > _userPrincipalFactory = new Mock <IUserClaimsPrincipalFactory <User> >();
            Mock <SignInManager <User> > signInMock = new Mock <SignInManager <User> >(userManagerMock.Object,
                                                                                       _contextAccessor.Object, _userPrincipalFactory.Object, null, null, null, null);

            Mock <UnitOfWork>     unitMock       = new Mock <UnitOfWork>(db.Object, signInMock.Object, userManagerMock.Object);
            Mock <DecryptService> decryptMock    = new Mock <DecryptService>();
            GetDataService        getDataService = new GetDataService(unitMock.Object, decryptMock.Object);

            //Act
            ResultOfApiRequest <UserFile> result = await getDataService.GetFile(user.Token, "1111", data);

            //Assert
            Assert.NotNull(result);
            Assert.Equal(HttpStatusCode.OK, result?.StatusCode);
        }
Example #2
0
        /// <summary>
        /// Method which add user to the database
        /// </summary>
        /// <param name="user">User</param>
        /// <returns></returns>
        public async Task <ResultOfApiRequest <User> > RegisterUser(User user)
        {
            //Result of the method
            ResultOfApiRequest <User> result;

            //Checking if user is exist in the database
            bool isExist = await _unitOfWork.UserRepository.GetUserByToken(user.Token) != null;

            if (isExist)
            {
                result = new ResultOfApiRequest <User>(null, HttpStatusCode.BadRequest);
                return(result);
            }
            else
            {
                //Creating user with temp information for returning to client side
                User userTempInfo = new User()
                {
                    Name     = user.Name,
                    Surname  = user.Surname,
                    Password = user.Password
                };

                //Encrypting user data
                string userEncryptedName     = _encryptService.EncryptData(user.Name);
                string userEncryptedSurname  = _encryptService.EncryptData(user.Surname);
                string userEncryptedPassword = _encryptService.EncryptData(user.Password);

                user.Name     = userEncryptedName;
                user.Surname  = userEncryptedSurname;
                user.Password = userEncryptedPassword;
                user.UserName = userTempInfo.Name;

                //Adding user to the database
                bool resultOfAdding = _unitOfWork.UserManager.CreateAsync(user, user.Password).Result.Succeeded;
                if (resultOfAdding)
                {
                    await _unitOfWork.BlockChainContext.SaveChangesAsync();

                    //Change user data to the normal view
                    user.Name     = userTempInfo.Name;
                    user.Password = userTempInfo.Password;
                    user.Surname  = userTempInfo.Surname;

                    result = new ResultOfApiRequest <User>(user, HttpStatusCode.OK);
                    return(result);
                }
                else
                {
                    result = new ResultOfApiRequest <User>(user, HttpStatusCode.BadRequest);
                    return(result);
                }
            }
        }
Example #3
0
        private async void RegisterMethodReturnsOkStatusCode()
        {
            //Arrange
            EncryptService encryptService = new EncryptService();

            string password = encryptService.EncryptData("1111");

            User user = new User("1111", "1111", "1111")
            {
                UserName = "******"
            };

            Mock <IQueryable <User> > users = new List <User>().AsQueryable().BuildMock();

            Mock <DbSet <User> > usersMock = new Mock <DbSet <User> >();

            SetSettingsInDb(usersMock, users);

            Mock <BlockChainContext> db = new Mock <BlockChainContext>();

            db.Setup(m => m.Users).Returns(usersMock.Object);

            Mock <UserManager <User> > userManagerMock = new Mock <UserManager <User> >(new Mock <IUserStore <User> >().Object,
                                                                                        null, null, null, null, null, null, null, null);

            Mock <IHttpContextAccessor> _contextAccessor = new Mock <IHttpContextAccessor>();

            Mock <IUserClaimsPrincipalFactory <User> > _userPrincipalFactory = new Mock <IUserClaimsPrincipalFactory <User> >();
            Mock <SignInManager <User> > signInMock = new Mock <SignInManager <User> >(userManagerMock.Object,
                                                                                       _contextAccessor.Object, _userPrincipalFactory.Object, null, null, null, null);


            userManagerMock.Setup(m => m.CreateAsync(user, password)).ReturnsAsync(IdentityResult.Success);

            Mock <UnitOfWork>     unitMock        = new Mock <UnitOfWork>(db.Object, signInMock.Object, userManagerMock.Object);
            Mock <EncryptService> encryptMock     = new Mock <EncryptService>();
            RegisterService       registerService = new RegisterService(unitMock.Object, encryptMock.Object);

            //Act
            ResultOfApiRequest <User> result = await registerService.RegisterUser(user);

            //Assert
            Assert.NotNull(result);
            Assert.Equal(user.Id, result?.Data?.Id);
            Assert.Equal(user.Name, result?.Data?.Name);
            Assert.Equal(user.Surname, result?.Data?.Surname);
            Assert.Equal(user.Password, result?.Data?.Password);
            Assert.Equal(user.Token, result?.Data?.Token);
            Assert.Equal(HttpStatusCode.OK, result?.StatusCode);
        }
Example #4
0
        public async Task <FileResult> Get(string fileName, string token = null, string password = null)
        {
            if (string.IsNullOrWhiteSpace(token) && string.IsNullOrWhiteSpace(password))
            {
                User user = await _unitOfWork.UserManager.GetUserAsync(User);

                if (user != null)
                {
                    token    = user.Token;
                    password = _decryptService.DecryptData(user.Password);
                }
                else
                {
                    return(null);
                }
            }

            //Checking data for validation
            if (!string.IsNullOrWhiteSpace(fileName))
            {
                //Result of getting data from the databse
                ResultOfApiRequest <UserFile> result = await _getDataService.GetFile(token, password, fileName);

                //Cheking if length of bytes of the file more than 0
                if (result.Data.Data.Length > 0)
                {
                    if (result.StatusCode == HttpStatusCode.OK)
                    {
                        //Creating the file for uploading to user
                        using (FileStream fs = new FileStream(result.Data.FileName, FileMode.Create))
                        {
                            await fs.WriteAsync(result.Data.Data, 0, result.Data.Data.Length);
                        }

                        //Creating file info that to get extension of the file
                        FileInfo fileInfo  = new FileInfo($"DataFromUsers/{fileName}");
                        string   extension = fileInfo?.Extension.Trim(new char[] { '.' });

                        return(PhysicalFile(fileInfo.FullName, $"application/{extension}", fileName));
                    }
                }
                else
                {
                    return(null);
                }
            }

            return(null);
        }
Example #5
0
        private async void RegisterMethodReturnsUserIsExist()
        {
            //Arrange
            User user = new User()
            {
                Name     = Guid.NewGuid().ToString(),
                Surname  = Guid.NewGuid().ToString(),
                Password = Guid.NewGuid().ToString()
            };

            Mock <IQueryable <User> > users = new List <User>()
            {
                user
            }.AsQueryable().BuildMock();

            Mock <DbSet <User> > usersMock = new Mock <DbSet <User> >();

            SetSettingsInDb(usersMock, users);

            Mock <BlockChainContext> db = new Mock <BlockChainContext>();

            db.Setup(m => m.Users).Returns(usersMock.Object);

            Mock <UserManager <User> > userManagerMock = new Mock <UserManager <User> >(new Mock <IUserStore <User> >().Object,
                                                                                        null, null, null, null, null, null, null, null);

            Mock <IHttpContextAccessor> _contextAccessor = new Mock <IHttpContextAccessor>();

            Mock <IUserClaimsPrincipalFactory <User> > _userPrincipalFactory = new Mock <IUserClaimsPrincipalFactory <User> >();
            Mock <SignInManager <User> > signInMock = new Mock <SignInManager <User> >(userManagerMock.Object,
                                                                                       _contextAccessor.Object, _userPrincipalFactory.Object, null, null, null, null);

            Mock <UnitOfWork>     unitMock        = new Mock <UnitOfWork>(db.Object, signInMock.Object, userManagerMock.Object);
            Mock <EncryptService> encryptMock     = new Mock <EncryptService>();
            RegisterService       registerService = new RegisterService(unitMock.Object, encryptMock.Object);

            //Act
            ResultOfApiRequest <User> result = await registerService.RegisterUser(user);

            //Assert
            Assert.NotNull(result);
            Assert.NotEqual(user.Id, result?.Data?.Id);
            Assert.NotEqual(user.Name, result?.Data?.Name);
            Assert.NotEqual(user.Surname, result?.Data?.Surname);
            Assert.NotEqual(user.Password, result?.Data?.Password);
            Assert.NotEqual(user.Token, result?.Data?.Token);
            Assert.Equal(HttpStatusCode.BadRequest, result?.StatusCode);
        }
Example #6
0
        private async void AddDataToTheChainReturnsOkRequest()
        {
            //Arrange
            Mock <IQueryable <Block> > blocks    = new List <Block>().AsQueryable().BuildMock();
            Mock <DbSet <Block> >      blockMock = new Mock <DbSet <Block> >();

            SetSettingsInDb(blockMock, blocks);
            EncryptService encryptService = new EncryptService();
            string         encryptedPass  = encryptService.EncryptData("1111");
            User           user           = new User("Dimitry", "Sukalo", encryptedPass);

            Mock <IQueryable <User> > users = new List <User>()
            {
                user
            }.AsQueryable().BuildMock();

            Mock <DbSet <User> > usersMock = new Mock <DbSet <User> >();

            SetSettingsInDb(usersMock, users);

            Mock <BlockChainContext> db = new Mock <BlockChainContext>();

            db.Setup(m => m.Blocks).Returns(blockMock.Object);
            db.Setup(m => m.Users).Returns(usersMock.Object);

            Mock <UserManager <User> > userManagerMock = new Mock <UserManager <User> >(new Mock <IUserStore <User> >().Object,
                                                                                        null, null, null, null, null, null, null, null);

            Mock <IHttpContextAccessor> _contextAccessor = new Mock <IHttpContextAccessor>();

            Mock <IUserClaimsPrincipalFactory <User> > _userPrincipalFactory = new Mock <IUserClaimsPrincipalFactory <User> >();
            Mock <SignInManager <User> > signInMock = new Mock <SignInManager <User> >(userManagerMock.Object,
                                                                                       _contextAccessor.Object, _userPrincipalFactory.Object, null, null, null, null);

            Mock <UnitOfWork>      unitMock        = new Mock <UnitOfWork>(db.Object, signInMock.Object, userManagerMock.Object);
            Mock <DecryptService>  decryptMock     = new Mock <DecryptService>();
            Mock <PostDataService> postDataService = new Mock <PostDataService>(unitMock.Object, decryptMock.Object);
            FormFile file = new FormFile(Stream.Null, 1, 1, "testfile", "");

            //Act
            ResultOfApiRequest <string> resultOfApiRequest = await postDataService.Object.AddDataToTheChain(file, user.Token, "1111", true);

            //Assert
            Assert.NotNull(resultOfApiRequest);
            Assert.Equal(HttpStatusCode.OK, resultOfApiRequest?.StatusCode);
        }
Example #7
0
        /// <summary>
        /// Get user file from the database for downloading
        /// </summary>
        /// <param name="token">User token</param>
        /// <param name="password">User password</param>
        /// <param name="fileName">User file name</param>
        /// <returns></returns>
        public async Task <ResultOfApiRequest <UserFile> > GetFile(string token, string password, string fileName)
        {
            //Getting user blocks from the database
            List <Block> blocks = _unitOfWork.BlockRepository.GetBlocksByUserToken(token);

            //Getting user from the databse
            User userFromDb = await _unitOfWork.UserRepository.GetUserByToken(token);

            //Creating object of the user file
            UserFile userFile = new UserFile(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new byte[0]);

            //Result of the method
            ResultOfApiRequest <UserFile> result;

            //Decrypting user password
            string userDecryptedPassword = _decryptService.DecryptData(userFromDb?.Password);

            if (blocks != null && userFromDb != null && userDecryptedPassword == password)
            {
                foreach (var block in blocks)
                {
                    if (block.Data.Title == fileName)
                    {
                        userFile = block.Data;
                        break;
                    }
                }

                if (userFile.Data.Length > 0)
                {
                    result = new ResultOfApiRequest <UserFile>(userFile, HttpStatusCode.OK);
                    return(result);
                }
                else
                {
                    result = new ResultOfApiRequest <UserFile>(userFile, HttpStatusCode.BadRequest);
                    return(result);
                }
            }

            result = new ResultOfApiRequest <UserFile>(userFile, HttpStatusCode.BadRequest);
            return(result);
        }
Example #8
0
        private async void GetBlocksMethodReturnsBadRequest()
        {
            //Arrange
            Mock <IQueryable <Block> > blocks    = new List <Block>().AsQueryable().BuildMock();
            Mock <DbSet <Block> >      blockMock = new Mock <DbSet <Block> >();

            SetSettingsInDb(blockMock, blocks);
            User user = new User("Dimitry", "Sukalo", "1111");

            Mock <IQueryable <User> > users = new List <User>().AsQueryable().BuildMock();

            Mock <DbSet <User> > usersMock = new Mock <DbSet <User> >();

            SetSettingsInDb(usersMock, users);

            Mock <BlockChainContext> db = new Mock <BlockChainContext>();

            db.Setup(m => m.Blocks).Returns(blockMock.Object);
            db.Setup(m => m.Users).Returns(usersMock.Object);

            Mock <UserManager <User> > userManagerMock = new Mock <UserManager <User> >(new Mock <IUserStore <User> >().Object,
                                                                                        null, null, null, null, null, null, null, null);

            Mock <IHttpContextAccessor> _contextAccessor = new Mock <IHttpContextAccessor>();

            Mock <IUserClaimsPrincipalFactory <User> > _userPrincipalFactory = new Mock <IUserClaimsPrincipalFactory <User> >();
            Mock <SignInManager <User> > signInMock = new Mock <SignInManager <User> >(userManagerMock.Object,
                                                                                       _contextAccessor.Object, _userPrincipalFactory.Object, null, null, null, null);

            Mock <UnitOfWork>     unitMock       = new Mock <UnitOfWork>(db.Object, signInMock.Object, userManagerMock.Object);
            Mock <DecryptService> decryptMock    = new Mock <DecryptService>();
            GetDataService        getDataService = new GetDataService(unitMock.Object, decryptMock.Object);

            //Act
            ResultOfApiRequest <UserFile> result = await getDataService.GetFile(user.Token, user.Password, Guid.NewGuid().ToString());

            //Assert
            Assert.NotNull(result);
            Assert.Equal(HttpStatusCode.BadRequest, result.StatusCode);
        }
Example #9
0
        public async Task <ActionResult <string> > Post(IFormFile file, string userToken = null, string password = null)
        {
            if (string.IsNullOrWhiteSpace(userToken) && string.IsNullOrWhiteSpace(password))
            {
                User user = await _unitOfWork.UserManager.GetUserAsync(User);

                if (user != null)
                {
                    userToken = user.Token;
                    password  = _decryptService.DecryptData(user.Password);
                }
                else
                {
                    return(BadRequest(JsonConvert.SerializeObject(new ResultOfApiRequest <string>("User doesn't exist", HttpStatusCode.BadRequest))));
                }
            }

            if (file != null)
            {
                //Getting result of adding data to the database
                ResultOfApiRequest <string> result = await _postDataService.AddDataToTheChain(file, userToken, password);

                //Converting result to json format
                string jsonData = JsonConvert.SerializeObject(result);
                if (result.StatusCode == HttpStatusCode.OK)
                {
                    return(Ok(jsonData));
                }
                else
                {
                    return(BadRequest(jsonData));
                }
            }

            return(BadRequest(JsonConvert.SerializeObject(new ResultOfApiRequest <string>(string.Empty, HttpStatusCode.BadRequest))));
        }
Example #10
0
        public async Task <ActionResult <ResultOfApiRequest <User> > > Post(RegisterViewModel registerViewModel)
        {
            if (registerViewModel != null && ModelState.IsValid)
            {
                if (registerViewModel.Name != "admin")
                {
                    MapperConfiguration configuration = new MapperConfiguration(conf => conf.CreateMap <RegisterViewModel, User>());
                    Mapper mapper = new Mapper(configuration);

                    User user = mapper.Map <RegisterViewModel, User>(registerViewModel);
                    if (user != null)
                    {
                        //Result of adding user to the database
                        ResultOfApiRequest <User> resultOfApiRequest = await _registerService.RegisterUser(user);

                        if (resultOfApiRequest.StatusCode == HttpStatusCode.OK)
                        {
                            return(Ok(resultOfApiRequest));
                        }
                        else
                        {
                            ModelState.AddModelError(string.Empty, "User is not registreted.");
                            return(BadRequest(ModelState));
                        }
                    }

                    ModelState.AddModelError(string.Empty, "Incorrect data");
                    return(BadRequest(ModelState));
                }

                ModelState.AddModelError(string.Empty, "Name cannot be admin");
                return(BadRequest(ModelState));
            }

            return(BadRequest(ModelState));
        }
Example #11
0
        /// <summary>
        /// Adding data to the block and adding block to the chain
        /// </summary>
        /// <param name="data">Data of the block</param>
        /// <returns></returns>
        public async Task <ResultOfApiRequest <string> > AddDataToTheChain(IFormFile file, string userToken, string password, bool isTest = false)
        {
            //Creating the chain and if chain is exist it will be downloaded from database
            Chain chain = new Chain(_unitOfWork);
            ResultOfApiRequest <string> result;

            //Getting user from the database
            User userFromDb = await _unitOfWork.UserRepository.GetUserByToken(userToken);

            //Creating new file name which will be saved to the database
            string newFileName = Guid.NewGuid().ToString() + file.FileName;

            //Decrypting user password for checking if it equal to requester password
            string userDecryptedPassword = _decryptService.DecryptData(userFromDb?.Password);

            if (userFromDb != null && userDecryptedPassword == password)
            {
                //Directory name where will be saved user file
                string dirName = "DataFromUsers";

                if (!Directory.Exists(dirName))
                {
                    Directory.CreateDirectory(dirName);
                }

                //Massive of bytes of the user file
                byte[]   fileData;
                UserFile userFile;

                DirectoryInfo directoryInfo = new DirectoryInfo(dirName);
                foreach (var fileInfo in directoryInfo.GetFiles())
                {
                    fileInfo.Delete();
                }

                //Checking if method is not used in testing
                if (!isTest)
                {
                    //Creating user file in directory
                    using (var fstream = new FileInfo($"DataFromUsers/{newFileName}").Create())
                    {
                        file.CopyTo(fstream);
                        fstream.Close();
                    }

                    //Getting file info for opening this file
                    FileInfo fileInfo = new FileInfo($"DataFromUsers/{newFileName}");

                    //Reading bytes from the file
                    using (FileStream fs = new FileStream(fileInfo.FullName, FileMode.Open))
                    {
                        fileData = new byte[fs.Length];
                        await fs.ReadAsync(fileData, 0, fileData.Length);

                        fs.Close();
                    }

                    //Creating object of user file
                    userFile = new UserFile(fileInfo.FullName, fileInfo.Name, fileData);

                    //Deleting file from the directory
                    fileInfo.Delete();
                }
                else
                {
                    userFile = new UserFile(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), new byte[1]);
                }

                //Adding user file to the database
                await chain.Add(userFile, userFromDb);

                result = new ResultOfApiRequest <string>(newFileName, HttpStatusCode.OK);
                return(result);
            }

            result = new ResultOfApiRequest <string>(newFileName, HttpStatusCode.BadRequest);
            return(result);
        }