Ejemplo n.º 1
0
        public async Task <ActionResult> RegisterNewSensor()
        {
            RegisterNewSensorViewModel sensorsFromApi = new RegisterNewSensorViewModel();

            //IDictionary<{SensorIdICB}, SensorType>
            IDictionary <string, SensorReadInData> availableSensorsFromAPI = await this.sensorApiService.ListSensorsFromAPI();

            this.sensorDbService.UpdateSensorTypes(availableSensorsFromAPI);

            IEnumerable <SensorReadInData> availableSensors = availableSensorsFromAPI.Values;

            sensorsFromApi.AvailableSensors = availableSensors;

            //to do later: check if sensors are no longer supported
            return(this.View(sensorsFromApi));
        }
        public void ReturnDefaultViewWithCorrectViewModel()
        {
            // Arrange
            // arrange controller
            Mock <ApplicationDbContext> mockApplicationDbContext = new Mock <ApplicationDbContext>();

            Mock <SensorDbService> mockSensorDbService = new Mock <SensorDbService>(mockApplicationDbContext.Object);

            Mock <HttpClient>       mockHttpClient       = new Mock <HttpClient>();
            Mock <SensorApiService> mockSensorApiService = new Mock <SensorApiService>(mockHttpClient.Object);

            // arrange availableSensorsFromAPI

            SensorReadInData sensorReadInData1 = new SensorReadInData();
            SensorReadInData sensorReadInData2 = new SensorReadInData();

            IDictionary <string, SensorReadInData> expected = new Dictionary <string, SensorReadInData>();

            expected.Add("key1", sensorReadInData1);
            expected.Add("key2", sensorReadInData2);

            // arrange sensorApiService
            mockSensorApiService.Setup(x => x.ListSensorsFromAPI())
            .Returns(Task.Run(() => expected));

            // arrange viewModel
            RegisterNewSensorViewModel registerNewSensorViewModel = new RegisterNewSensorViewModel
            {
                AvailableSensors = expected.Values
            };

            // arrange actual controller
            SensorController sensorController = new SensorController(mockSensorDbService.Object, mockSensorApiService.Object);

            // act and assert
            sensorController.WithCallTo(c => c.RegisterNewSensor())
            .ShouldRenderDefaultView()
            .WithModel <RegisterNewSensorViewModel> (actual =>
            {
                Assert.IsNotNull(actual.AvailableSensors);
                CollectionAssert.AreEquivalent(registerNewSensorViewModel.AvailableSensors.ToList(),
                                               actual.AvailableSensors.ToList());
            });
        }
        public async Task NotRegisterSensor_WhenSensorIsBooleanAndNonZeroValuesAreSetToMinAndMaxValue()
        {
            // Arrange
            // arrange controller
            Mock <ApplicationDbContext> mockApplicationDbContext = new Mock <ApplicationDbContext>();

            Mock <SensorDbService> mockSensorDbService = new Mock <SensorDbService>(mockApplicationDbContext.Object);

            Mock <HttpClient>       mockHttpClient       = new Mock <HttpClient>();
            Mock <SensorApiService> mockSensorApiService = new Mock <SensorApiService>(mockHttpClient.Object);

            //arrange RegisterNewSensorViewModel
            DateTime testDateTime1 = DateTime.Now;
            Sensor   testSensor    = new Sensor
            {
                SensorId = 8,
                Name     = "dsadas",
                DescriptionGivenByTheUser = "******",
                MeasurementType           = "C",
                IsPublic       = true,
                OperatingRange = "This sensor will return true or false value", //reference
                MinValue       = 13.4,                                          //invalid testing value
                MaxValue       = 14.4,                                          //invalid testing value
                AddedOn        = testDateTime1,
                Measurements   = new HashSet <Measurement>(),
                SharedWith     = new HashSet <ApplicationUser>()
            };

            DateTime  testDateTime2 = DateTime.Now;
            LastValue testLastValue = new LastValue
            {
                SensorId        = 45,
                Sensor          = testSensor,
                SensorIdICB     = "SensorIdICB",
                PollingInterval = 10,
                Value           = "Value",
                LastUpdatedOn   = testDateTime2
            };

            testSensor.LastValue = testLastValue;

            RegisterNewSensorViewModel expected = new RegisterNewSensorViewModel
            {
                Sensor = testSensor
            };

            //koleto. Zaradi validaciite
            SensorType sensorType = new SensorType
            {
                Id             = 342,
                SensorIdICB    = "SensorIdICB",
                IsNumericValue = true,
                MeasureType    = "C",
                MinPollingIntervalInSeconds = 2,
                Tag = "Tag"
            };

            mockSensorDbService.Setup(x => x.GetSpecificSensorType("SensorIdICB"))
            .Returns(sensorType);

            IDictionary <string, SensorReadInData> mockSensorsFromAPI = new Dictionary <string, SensorReadInData>();

            mockSensorsFromAPI.Add("SensorIdICB", new SensorReadInData()
            {
                Tag = "Tag",
                MinPollingIntervalInSeconds = 0,
                MeasureType = "C",
                Description = "This sensor will return values between 6 and 18",
                SensorId    = "SensorIdICB"
            });

            mockSensorApiService.Setup(x => x.ListSensorsFromAPI())
            .Returns(Task.Run(() => mockSensorsFromAPI));

            //arrange username
            string loggeduser = "******";

            // arrange actual controller
            SensorControllerMock controller = new SensorControllerMock(loggeduser, mockSensorDbService.Object, mockSensorApiService.Object);

            //act
            await controller.RegisterNewSensor(expected);

            // assert
            mockSensorDbService.Verify(x => x.RegisterNewSensor(loggeduser, testSensor), Times.Never);
        }
Ejemplo n.º 4
0
        public async Task <ActionResult> RegisterNewSensor(RegisterNewSensorViewModel wrappedRegisterNewSensorModel)
        {
            Sensor newSensor = wrappedRegisterNewSensorModel.Sensor;

            //validation
            if (!this.ModelState.IsValid)
            {
                return(this.RedirectToAction("InvalidInput", new { message = "Invalid model state." }));
            }

            if (newSensor.LastValue.SensorIdICB == null)
            {
                return(this.RedirectToAction("InvalidInput", new { message = "Sensor ID cannot be empty." }));
            }

            if (newSensor.Name == null)
            {
                return(this.RedirectToAction("InvalidInput", new { message = "Name cannot be empty." }));
            }

            try
            {
                SensorType serverSensorType = this.sensorDbService
                                              .GetSpecificSensorType(newSensor.LastValue.SensorIdICB);

                if (newSensor.LastValue.PollingInterval < serverSensorType.MinPollingIntervalInSeconds)
                {
                    return(this.RedirectToAction("InvalidInput", new { message = "Invalid minimal polling interval." }));
                }

                //emergencyPatch. To Fix later - - - - -
                //Fix here: In SensorTypes database model must be added OperationalRange property, from where to cross check the input min/max values
                IDictionary <string, SensorReadInData> emergencySensorsFromAPI = await this.sensorApiService.ListSensorsFromAPI();

                SensorReadInData serverSensor = emergencySensorsFromAPI[newSensor.LastValue.SensorIdICB];

                string   operatingRange = serverSensor.Description;
                string[] substring      = operatingRange.Split();

                //"This sensor will return values between 6 and 18" or "This sensor will return true or false value"
                if (substring.Contains("between"))
                {
                    //case sensor is integer type
                    double serverMinVal = double.Parse(substring[substring.Length - 3]);
                    double serverMaxVal = double.Parse(substring[substring.Length - 1]);

                    if (newSensor.MinValue >= serverMinVal && newSensor.MinValue <= serverMaxVal)
                    {
                    }
                    else
                    {
                        return(this.RedirectToAction("InvalidInput", new { message = "Invalid sensor minimal value." }));
                    }

                    if (newSensor.MaxValue <= serverMaxVal && newSensor.MaxValue >= serverMinVal)
                    {
                    }
                    else
                    {
                        return(this.RedirectToAction("InvalidInput", new { message = "Invalid sensor maximum value." }));
                    }
                }
                else
                {
                    //case sensor is boolean type
                    if (newSensor.MinValue != 0 || newSensor.MaxValue != 0)
                    {
                        return(this.RedirectToAction("InvalidInput", new { message = "Invalid sensor min / maximum value when the sensor is boolean type." }));
                    }
                }

                newSensor.MeasurementType = serverSensor.MeasureType;
                //newSensor.SensorType
            }
            catch
            {
                //this is if the user tries even entering invalid sensorIdICB just to brake the application
                return(this.RedirectToAction("InvalidInput", new { message = "Invalid sensor ID." }));
            }

            this.sensorDbService
            .RegisterNewSensor(GetLoggedUsername(), newSensor);

            return(this.View("Success"));
        }