public async Task does_not_download_when_data_is_up_to_date(
            short minNumberOfMeasurements)
        {
            // Arrange
            const short numberOfDays = 1;

            var downloadedData = new Measurements();
            var startDate      = DateTime.UtcNow.AddHours(-(2 * minNumberOfMeasurements) + 1);

            _context.AddAllMeasurementsToDatabase(
                _installationIds, startDate, numberOfDays, minNumberOfMeasurements);

            _downloaderMock.Setup(x => x.DownloadAirQualityData(It.IsAny <short>()))
            .ReturnsAsync(downloadedData);

            var programController = new ProgramController(
                unitOfWork: _unitOfWork,
                installationIds: _installationIds,
                airlyMeasurementsDownloader: _downloaderMock.Object,
                minNumberOfMeasurements: minNumberOfMeasurements);

            // Act
            var newMeasurementsList
                = await programController.DownloadAllAirQualityData();

            // Assert
            _downloaderMock.Verify(
                x => x.DownloadAirQualityData(It.IsAny <short>()), Times.Never());
        }
        public async Task download_for_all_installations_when_no_measurements_in_database()
        {
            // Arrange
            var downloadedData = new Measurements();

            foreach (short installationId in _installationIds)
            {
                _downloaderMock.Setup(x => x.DownloadAirQualityData(installationId))
                .ReturnsAsync(downloadedData);
            }

            var programController = new ProgramController(
                unitOfWork: _unitOfWork,
                installationIds: _installationIds,
                airlyMeasurementsDownloader: _downloaderMock.Object);

            // Act
            var newMeasurementsList
                = await programController.DownloadAllAirQualityData();

            // Assert
            _downloaderMock.Verify(
                x => x.DownloadAirQualityData(It.IsAny <short>()),
                Times.Exactly(_installationIds.Count));
        }
        public async Task download_for_some_installations_when_some_data_is_out_of_date()
        {
            // Arrange
            const short numberOfDays = 1;

            var downloadedData  = new Measurements();
            var installationIds = new List <short>();

            var startDate = DateTime.UtcNow.AddHours(-(2 * _minNumberOfMeasurements));

            for (int i = 0; i < _installationIds.Count; i++)
            {
                _context.AddMeasurementsToDatabase(
                    _installationIds[i], startDate, numberOfDays, _minNumberOfMeasurements);

                if (i % 2 == 0)
                {
                    _context.AddMeasurementsToDatabase(
                        _installationIds[i],
                        startDate.AddHours(_minNumberOfMeasurements),
                        numberOfDays,
                        _minNumberOfMeasurements);
                }
                else
                {
                    _downloaderMock.Setup(x => x.DownloadAirQualityData(_installationIds[i]))
                    .ReturnsAsync(downloadedData);
                }
            }

            var programController = new ProgramController(
                unitOfWork: _unitOfWork,
                installationIds: _installationIds,
                airlyMeasurementsDownloader: _downloaderMock.Object,
                minNumberOfMeasurements: _minNumberOfMeasurements);

            // Act
            var newMeasurementsList
                = await programController.DownloadAllAirQualityData();

            // Assert
            _downloaderMock.Verify(
                x => x.DownloadAirQualityData(It.IsAny <short>()),
                Times.Exactly((int)Math.Ceiling((double)_installationIds.Count / 2)));
        }