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>();
        }
        private static async Task <ControllerContext> RequestWithFiles(IDictionary <string, string> fileDictionary,
                                                                       LogUploadData formData     = null,
                                                                       IEnumerable <Claim> claims = null)
        {
            var boundary = "---9908908098";

            var isFirst = true;

            using (var formDataContent = new MultipartFormDataContent(boundary))
            {
                foreach (var kvp in fileDictionary)
                {
                    var fileRole = (isFirst) ? nameof(LogUploadData.LogFile) : "SomeOtherUnusedRole";
                    isFirst = false;
                    formDataContent.Add(new ByteArrayContent(Encoding.UTF8.GetBytes(kvp.Value)), fileRole, kvp.Key);
                }

                if (formData != null)
                {
                    var formDataDictionary =
                        JsonConvert.DeserializeObject <Dictionary <string, string> >(
                            JsonConvert.SerializeObject(formData));

                    foreach (var kvp in formDataDictionary.Where(i => i.Value != null))
                    {
                        formDataContent.Add(new ByteArrayContent(Encoding.UTF8.GetBytes(kvp.Value)), kvp.Key);
                    }
                }

                var httpContext = new DefaultHttpContext();

                httpContext.User = new ClaimsPrincipal(new ClaimsIdentity(claims ?? Enumerable.Empty <Claim>()));

                httpContext.Request.Headers.Add("Content-Type", $"multipart/form-data; boundary={boundary}");

                httpContext.Request.Body = new MemoryStream(await formDataContent.ReadAsByteArrayAsync());
                var actionContext = new ActionContext(httpContext, new RouteData(), new ControllerActionDescriptor());
                return(new ControllerContext(actionContext));
            }
        }
        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);
        }