public async Task UploadFilesTest()
        {
            var fileContents = new Faker <string>().CustomInstantiator(f => f.Lorem.Paragraphs(3, 10)).Generate(4)
                               .ToDictionary(f => $"{string.Join("_", new Faker().Lorem.Words(4))}.txt", f => f);

            var fileService = Substitute.For <ITempFileService>();
            var checkRunSubmissionService = Substitute.For <Web.Interfaces.ICheckRunSubmissionService>();

            var receivedFiles = new Dictionary <string, string>();

            fileService.CreateFromStreamAsync(Arg.Any <string>(), Arg.Any <Stream>())
            .Returns(ci =>
            {
                var fileName = (string)ci[0];
                var stream   = (Stream)ci[1];
                receivedFiles.Add(fileName, new StreamReader(stream, Encoding.UTF8).ReadToEnd());
                return($"temp/{fileName}");
            });

            var checkRunController = new CheckRunControllerStub(TestLogger.Create <CheckRunController>(_testOutputHelper), fileService, checkRunSubmissionService, Substitute.For <ITelemetryService>())
            {
                ControllerContext  = await RequestWithFiles(fileContents),
                MetadataProvider   = new EmptyModelMetadataProvider(),
                ModelBinderFactory = Substitute.For <IModelBinderFactory>(),
                ObjectValidator    = Substitute.For <IObjectModelValidator>()
            };

            await checkRunController.Upload();

            await fileService.Received(1).CreateFromStreamAsync(Arg.Any <string>(), Arg.Any <Stream>());

            receivedFiles.Count.Should().Be(1);
        }
        public async Task UploadWithMissingFile()
        {
            var name        = "dummyFileName.txt";
            var fileContent = "This is some dummy file contents";

            var fileDictionary = new Dictionary <string, string> {
                { name, fileContent }
            };

            var fileService = Substitute.For <ITempFileService>();
            var checkRunSubmissionService = Substitute.For <Web.Interfaces.ICheckRunSubmissionService>();

            var receivedFiles = new Dictionary <string, string>();

            fileService.CreateFromStreamAsync(Arg.Any <string>(), Arg.Any <Stream>())
            .Returns(ci =>
            {
                var fileName = (string)ci[0];
                var stream   = (Stream)ci[1];
                receivedFiles.Add(fileName, new StreamReader(stream, Encoding.UTF8).ReadToEnd());
                return($"temp/{fileName}");
            });
            fileService.Files.Returns(new[] { name });

            var logUploadData = new LogUploadData
            {
                CommitSha = "12345",
                LogFile   = "someOtherFileName.txt" //Bad Data
            };

            var checkRunController = new CheckRunControllerStub(TestLogger.Create <CheckRunController>(_testOutputHelper), fileService, checkRunSubmissionService, Substitute.For <ITelemetryService>())
            {
                ControllerContext  = await RequestWithFiles(fileDictionary, logUploadData),
                MetadataProvider   = new EmptyModelMetadataProvider(),
                ModelBinderFactory = Substitute.For <IModelBinderFactory>(),
                ObjectValidator    = Substitute.For <IObjectModelValidator>()
            };

            var result = await checkRunController.Upload() as BadRequestObjectResult;

            result.Should().NotBeNull();
            result.Value.Should().BeOfType <SerializableError>();
        }
        public async Task UploadBadRequestTest()
        {
            var fileService = Substitute.For <ITempFileService>();
            var checkRunSubmissionService = Substitute.For <Web.Interfaces.ICheckRunSubmissionService>();

            var checkRunController = new CheckRunControllerStub(TestLogger.Create <CheckRunController>(_testOutputHelper), fileService, checkRunSubmissionService, Substitute.For <ITelemetryService>())
            {
                ControllerContext = new ControllerContext
                {
                    HttpContext = new DefaultHttpContext()
                },
                MetadataProvider   = new EmptyModelMetadataProvider(),
                ModelBinderFactory = Substitute.For <IModelBinderFactory>(),
                ObjectValidator    = Substitute.For <IObjectModelValidator>()
            };

            var result = await checkRunController.Upload() as BadRequestObjectResult;

            result.Should().NotBeNull();
            result.StatusCode.Should().Be(400);
        }
        public async Task UploadFileTest()
        {
            var name        = "dummyFileName.txt";
            var fileContent = "This is some dummy file contents";

            var fileDictionary = new Dictionary <string, string> {
                { name, fileContent }
            };

            var fileService = Substitute.For <ITempFileService>();
            var checkRunSubmissionService = Substitute.For <Web.Interfaces.ICheckRunSubmissionService>();

            var receivedFiles = new Dictionary <string, string>();

            fileService.CreateFromStreamAsync(Arg.Any <string>(), Arg.Any <Stream>())
            .Returns(ci =>
            {
                var fileName = (string)ci[0];
                var stream   = (Stream)ci[1];
                receivedFiles.Add(fileName, new StreamReader(stream, Encoding.UTF8).ReadToEnd());
                return($"temp/{fileName}");
            });

            var checkRunController = new CheckRunControllerStub(TestLogger.Create <CheckRunController>(_testOutputHelper), fileService, checkRunSubmissionService, Substitute.For <ITelemetryService>())
            {
                ControllerContext  = await RequestWithFiles(fileDictionary),
                MetadataProvider   = new EmptyModelMetadataProvider(),
                ModelBinderFactory = Substitute.For <IModelBinderFactory>(),
                ObjectValidator    = Substitute.For <IObjectModelValidator>()
            };

            await checkRunController.Upload();

            await fileService.Received(1).CreateFromStreamAsync(Arg.Is(name), Arg.Any <Stream>());

            receivedFiles.Should().BeEquivalentTo(fileDictionary);
        }
        public async Task UploadFileWithFormData()
        {
            var name        = "dummyFileName.txt";
            var fileContent = "This is some dummy file contents";

            var fileDictionary = new Dictionary <string, string> {
                { name, fileContent }
            };

            var fileService = Substitute.For <ITempFileService>();
            var checkRunSubmissionService = Substitute.For <Web.Interfaces.ICheckRunSubmissionService>();

            var receivedFiles = new Dictionary <string, string>();

            fileService.CreateFromStreamAsync(Arg.Any <string>(), Arg.Any <Stream>())
            .Returns(ci =>
            {
                var fileName = (string)ci[0];
                var stream   = (Stream)ci[1];
                receivedFiles.Add(fileName, new StreamReader(stream, Encoding.UTF8).ReadToEnd());
                return($"temp/{fileName}");
            });
            fileService.Files.Returns(new[] { name });

            var checkRun = new CheckRun
            {
                Id  = Faker.Random.Long(),
                Url = Faker.Internet.Url()
            };

            checkRunSubmissionService.SubmitAsync(null, null, null, null, 0).ReturnsForAnyArgs(checkRun);

            var logUploadData = new LogUploadData
            {
                CommitSha         = "12345",
                PullRequestNumber = 345
            };

            var faker = new Faker();

            var repoOwner = faker.Person.FullName;
            var repoName  = faker.Hacker.Phrase();

            var claims = new[]
            {
                new Claim("urn:bcc:repositoryName", repoName),
                new Claim("urn:bcc:repositoryOwner", repoOwner),
                new Claim("urn:bcc:repositoryOwnerId", faker.Random.Long().ToString())
            };

            var checkRunController = new CheckRunControllerStub(TestLogger.Create <CheckRunController>(_testOutputHelper), fileService, checkRunSubmissionService, Substitute.For <ITelemetryService>())
            {
                ControllerContext  = await RequestWithFiles(fileDictionary, logUploadData, claims),
                MetadataProvider   = new EmptyModelMetadataProvider(),
                ModelBinderFactory = Substitute.For <IModelBinderFactory>(),
                ObjectValidator    = Substitute.For <IObjectModelValidator>()
            };

            var result = await checkRunController.Upload() as JsonResult;

            await fileService.Received(1).CreateFromStreamAsync(Arg.Is(name), Arg.Any <Stream>());

            await checkRunSubmissionService.Received(1).SubmitAsync(
                repoOwner,
                repoName,
                logUploadData.CommitSha,
                string.Empty,
                logUploadData.PullRequestNumber);

            receivedFiles.Should().BeEquivalentTo(fileDictionary);

            var resultFormData = result?.Value as CheckRun;

            resultFormData.Should().NotBeNull();
            resultFormData.Id.Should().Be(checkRun.Id);
            resultFormData.Url.Should().Be(checkRun.Url);
        }