public async Task Handle_PrivateKeyPlainOnServer_ShouldSucceed()
        {
            var mockProjectRepo = new Mock <IProjectRepository>();

            mockProjectRepo.Setup(x => x.GetById(It.IsAny <int>())).ReturnsAsync(new Project("test", new AsymmetricKey("PUBLIC KEY", "PLAIN KEY")));

            var mockFilesRepo = new Mock <IStoredFileRepository>();

            mockFilesRepo.Setup(x => x.FindByHash(It.IsAny <Hash>())).ReturnsAsync(new StoredFile("HASH", 100, 80));

            var mockAsymCrypto = new Mock <IAsymmetricCryptoHandler>();

            mockAsymCrypto.Setup(x => x.SignHash(It.IsAny <Hash>(), "PLAIN KEY")).Returns("FILE SIGNATURE");

            var action = new AddUpdatePackageFilesAction(mockFilesRepo.Object, mockProjectRepo.Object, mockAsymCrypto.Object, null);

            var files = new List <UpdateFileInfo>
            {
                new UpdateFileInfo("asd", Hash.Parse("FF")),
                new UpdateFileInfo("asd2", Hash.Parse("EE")),
            };

            var package = new UpdatePackage("1.0.0");

            // act
            await action.AddFiles(package, files, null);

            // assert
            Assert.False(action.HasError);

            Assert.Equal(2, package.Files.Count());
            Assert.Collection(package.Files, x => Assert.Equal("FILE SIGNATURE", x.Signature), x => Assert.Equal("FILE SIGNATURE", x.Signature));
        }
        public async Task Handle_GivenFilesWithInvalidSignature_PrivateKeyNotOnServer_ShouldFail()
        {
            var mockProjectRepo = new Mock <IProjectRepository>();

            mockProjectRepo.Setup(x => x.GetById(It.IsAny <int>())).ReturnsAsync(new Project("test", new AsymmetricKey("PUBLIC KEY")));

            var mockFilesRepo = new Mock <IStoredFileRepository>();

            mockFilesRepo.Setup(x => x.FindByHash(It.IsAny <Hash>())).ReturnsAsync(new StoredFile("HASH", 100, 80));

            var mockAsymCrypto = new Mock <IAsymmetricCryptoHandler>();

            mockAsymCrypto.Setup(x => x.VerifyHash(It.IsAny <Hash>(), "SIGNATURE", "PUBLIC KEY")).Returns(false);

            var action = new AddUpdatePackageFilesAction(mockFilesRepo.Object, mockProjectRepo.Object, mockAsymCrypto.Object, null);

            var files = new List <UpdateFileInfo>
            {
                new UpdateFileInfo("asd", Hash.Parse("FF"), "SIGNATURE")
            };

            var package = new UpdatePackage("1.0.0");

            // act
            await action.AddFiles(package, files, null);

            // assert
            ErrorUtils.AssertError(action, ErrorType.ValidationError);
        }
        public async Task Handle_GivenInvalidKeyPassword_PrivateKeyEncryptedOnServer_ShouldFail()
        {
            var mockProjectRepo = new Mock <IProjectRepository>();

            mockProjectRepo.Setup(x => x.GetById(It.IsAny <int>())).ReturnsAsync(new Project("test", new AsymmetricKey("PUBLIC KEY", "ENCRYPTED KEY", true)));

            var mockFilesRepo = new Mock <IStoredFileRepository>();

            mockFilesRepo.Setup(x => x.FindByHash(It.IsAny <Hash>())).ReturnsAsync(new StoredFile("HASH", 100, 80));

            var mockSymmCrypto = new Mock <ISymmetricEncryption>();

            mockSymmCrypto.Setup(x => x.DecryptString("ENCRYPTED KEY", "Invalid Password")).Throws(new Exception("Invalid Password"));

            var action = new AddUpdatePackageFilesAction(mockFilesRepo.Object, mockProjectRepo.Object, null, mockSymmCrypto.Object);

            var files = new List <UpdateFileInfo>
            {
                new UpdateFileInfo("asd", Hash.Parse("FF"), "")
            };

            var package = new UpdatePackage("1.0.0");

            // act
            await action.AddFiles(package, files, "Invalid Password");

            // assert
            ErrorUtils.AssertError(action, ErrorType.ValidationError);
        }