public async Task <bool> CompleteExperiment(Guid participantId, string key)
        {
            bool success = false;

            if (!participantId.Equals(Guid.Empty) && !String.IsNullOrEmpty(key))
            {
                try
                {
                    ExperimentRequest model = new ExperimentRequest()
                    {
                        ApiKey        = key,
                        ParticipantId = participantId
                    };
                    using (HttpClient client = new HttpClient())
                    {
                        string url      = $"{ApiHost}/api/experiment";
                        string json     = JsonConvert.SerializeObject(model, Formatting.Indented);
                        var    response = await client.PostAsync(url, new StringContent(json, Encoding.UTF8, "application/json"));

                        if (response.StatusCode == HttpStatusCode.OK)
                        {
                            success = JsonConvert.DeserializeObject <bool>(await response.Content.ReadAsStringAsync());
                        }
                    }
                }
                catch (Exception ex)
                {
                    // _failures.Add(ex);
                }
            }
            return(success);
        }
예제 #2
0
        public void Create_GoodWeather()
        {
            HttpContext.Current = MockHelper.FakeHttpContext("experiments");

            _context.Users.Add(new UserEntity()
            {
                Name = "Bobby", Email = "*****@*****.**"
            });
            _context.Companies.Add(new CompanyEntity()
            {
                Name = "Some crazy company", Description = "That is the most crazy company"
            });
            var experimentToCreate = new ExperimentRequest()
            {
                Name = "Some amazing experiment", Description = "The most crazy cells you can find out there"
            };
            var res = _controller.Create(experimentToCreate) as OkNegotiatedContentResult <bool>;

            Assert.NotNull(res);
            Assert.IsTrue(res.Content);
            Assert.AreEqual(1, _context.Experiments.ToList()[0].Id);
            Assert.AreEqual("Some amazing experiment", _context.Experiments.ToList()[0].Name);
            Assert.AreEqual("The most crazy cells you can find out there",
                            _context.Experiments.ToList()[0].Description);
        }
예제 #3
0
        public void Update_BadWeather()
        {
            // #1 - Try updating an experiment with empty/null body
            var res = _controller.Update(1, null) as BadRequestErrorMessageResult;

            Assert.NotNull(res);
            Assert.AreEqual("Empty request body!", res.Message);

            // #2 - Try updating a non-existing company
            var updatedExperiment = new ExperimentRequest()
            {
                Name = "MySuccessfulExperiment", Description = "Some new crazy description"
            };
            var res1 = _controller.Update(1, updatedExperiment);

            Assert.IsNotNull(res1);
            Assert.IsInstanceOf <NotFoundResult>(res1);

            // #3 - Try updating a company without providing a company name
            _controller.ModelState.AddModelError("error", "An experiment name must be provided!");
            updatedExperiment = new ExperimentRequest()
            {
                Description = "The most crazy experiment you can find out there"
            };
            res = _controller.Update(1, updatedExperiment) as BadRequestErrorMessageResult;
            Assert.NotNull(res);
            Assert.AreEqual("An experiment name must be provided!", res.Message);
        }
예제 #4
0
        public void Model_Validation()
        {
            var experimentToCreate = new ExperimentRequest()
            {
                Description = "An experiment without a name shouldn't pass"
            };
            var context           = new ValidationContext(experimentToCreate, null, null);
            var results           = new List <ValidationResult>();
            var isModelStateValid = Validator.TryValidateObject(experimentToCreate, context, results, true);

            Assert.IsFalse(isModelStateValid);
        }
예제 #5
0
        public IHttpActionResult Create(ExperimentRequest experimentRequest)
        {
            if (experimentRequest == null)
            {
                return(BadRequest("Empty request body!"));
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ControllerHelper.GetModelStateErrorMessages(ModelState)));
            }


            var result = _experimentService.Create(experimentRequest, HttpContext.Current);

            return(Ok(result));
        }
예제 #6
0
        public void Create_BadWeather()
        {
            // #1 - Try creating an experiment with empty/null body
            var res = _controller.Create(null) as BadRequestErrorMessageResult;

            Assert.NotNull(res);
            Assert.AreEqual("Empty request body!", res.Message);

            // #2 - Try creating an experiment without providing an experiment name
            _controller.ModelState.AddModelError("error", "An experiment name must be provided!");
            var experimentRequest = new ExperimentRequest()
            {
                Description = "The most crazy experiment you can find out there"
            };

            res = _controller.Create(experimentRequest) as BadRequestErrorMessageResult;
            Assert.NotNull(res);
            Assert.AreEqual("An experiment name must be provided!", res.Message);
        }
예제 #7
0
        public IHttpActionResult Update(int id, ExperimentRequest experimentRequest)
        {
            if (experimentRequest == null)
            {
                return(BadRequest("Empty request body!"));
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ControllerHelper.GetModelStateErrorMessages(ModelState)));
            }

            var experiment = _experimentService.GetById(id);

            if (experiment == null)
            {
                return(NotFound());
            }

            var result = _experimentService.Update(id, experimentRequest, HttpContext.Current);

            return(Ok(result));
        }
예제 #8
0
        public ExperimentResult Generate(ExperimentRequest request)
        {
            _logger.LogInformation("Incoming experimet request: {0}", request);

            var result = new ExperimentResult();

            if (request.TraySize != (int)TraySizes.Small && request.TraySize != (int)TraySizes.Large)
            {
                result.Message = "Invalid tray size";
                return(result);
            }

            try
            {
                var wells = request.Experiments.SelectMany(e => e.GetWells());
                if (wells.Count() > request.TraySize * request.AllowedPlates)
                {
                    result.Message = "Unable to fulfill experiment (too few plates)";
                    return(result);
                }

                wells = wells.OrderByDescending(w => w.GroupingPriority);       //sort is important to have similar together
                var groups = wells.GroupBy(w => w.GroupingKey);                 //group by most numerous (set internally in preparation part)

                result.Trays = new Tray[request.AllowedPlates];
                //for (var trayIndex = 0; trayIndex < result.Trays.Length; trayIndex++)
                //{
                var trayIndex = 0;
                result.Trays[trayIndex] = new Tray {
                    TraySize = request.TraySize
                };

                var rowIndex = 0;
                foreach (var group in groups)
                {
                    var columnIndex = 0;
                    var groupingKey = group.Key;
                    foreach (var well in group)
                    {
                        well.Row    = rowIndex + 1;
                        well.Column = columnIndex + 1;
                        result.Trays[trayIndex].Wells.Add(well);

                        columnIndex++;

                        if (columnIndex % result.Trays[trayIndex].Columns == 0 ||                      //new row if current row is filled
                            groupingKey != well.GroupingKey)                                //or sample changed
                        {
                            columnIndex = 0;
                            rowIndex++;
                            groupingKey = well.GroupingKey;
                        }

                        if (rowIndex >= result.Trays[trayIndex].Rows)                         //new tray (should break if allowed trays is breached)
                        {
                            if (trayIndex++ == request.AllowedPlates)
                            {
                                throw new ArgumentOutOfRangeException("AllowedPlates", "Number of allowed plates has been breached");
                            }

                            result.Trays[trayIndex] = new Tray {
                                TraySize = request.TraySize
                            };
                            rowIndex    = 0;
                            columnIndex = 0;
                        }
                    }

                    rowIndex++;
                }
                //}

                result.Message = "OK";
            }
            catch (Exception ex)
            {
                result.Message = string.Concat("Error generating experiments: ", ex.Message);
                _logger.LogError(ex, "Error generating experiment");
            }

            return(result);
        }