public void CalculationsWorkflow_Should_Succeed_When_GivenValidInputs() { var calculations = new List <string>(); var securities = new List <FISecurity>(); var jobSettings = new FIJobSettings(asOfDate: "20201201"); var fiCalculationParameters = new FICalculationParameters(securities, calculations, jobSettings); var fiCalculationParametersRoot = new FICalculationParametersRoot(data: fiCalculationParameters); Console.WriteLine(JsonConvert.SerializeObject(fiCalculationParametersRoot)); try { var postAndOptimizeHttpResponse = fiCalculationsApi.PostAndCalculateWithHttpInfo(fICalculationParametersRoot: fiCalculationParametersRoot); postAndOptimizeHttpResponse.StatusCode .Should() .Match <HttpStatusCode>(c => c == HttpStatusCode.Created || c == HttpStatusCode.Accepted || c == HttpStatusCode.OK); switch (postAndOptimizeHttpResponse.StatusCode) { case HttpStatusCode.Accepted: var optimizationId = postAndOptimizeHttpResponse.Headers["X-Factset-Api-Calculation-Id"].First(); bool shouldPoll; do { var pollingResponse = fiCalculationsApi.GetCalculationStatusByIdWithHttpInfo(optimizationId); pollingResponse.StatusCode .Should() .Match <HttpStatusCode>(c => c == HttpStatusCode.Created || c == HttpStatusCode.Accepted); if (pollingResponse.StatusCode == HttpStatusCode.Created) { break; } shouldPoll = pollingResponse.StatusCode == HttpStatusCode.Accepted; if (pollingResponse.Headers.ContainsKey("Cache-Control")) { var maxAge = pollingResponse.Headers["Cache-Control"][0]; if (string.IsNullOrWhiteSpace(maxAge)) { Console.WriteLine("Sleeping for 2 seconds"); // Sleep for at least 2 seconds. Thread.Sleep(2000); } else { var age = int.Parse(maxAge.Replace("max-age=", "")); Console.WriteLine($"Sleeping for {age} seconds"); Thread.Sleep(age * 1000); } } } while (shouldPoll); var getResultResponse = fiCalculationsApi.GetCalculationResultWithHttpInfo(optimizationId); getResultResponse.StatusCode.Should().Be(HttpStatusCode.OK); getResultResponse.Data.Should().NotBeNull(); break; } } catch (Exception e) { Console.WriteLine(e); } }