private string GetVesselUpdateQuery(VesselUpdateModel update) { VesselAisUpdateModel existingVessel = FindExistingVessel(update.VesselId); existingVessel.VesselId = update.VesselId; existingVessel.Imo = update.IMO; string query = BuildSingleVesselQuery(existingVessel, update) ?? ""; return(query); }
public async Task <VesselUpdateModel> GetVesselUpdatesAsync(VesselAisUpdateModel aisUpdateModel, CancellationToken token, SemaphoreSlim semaphoreThrottel) { VesselUpdateModel vessel = null; try { bool skip = false; if (aisUpdateModel.Mmsi == 0) //if could not be scrapped with "full" { skip = true; _progress.AddSkipped(); } await semaphoreThrottel.WaitAsync(); if (!skip) { vessel = _scrapper.ScrapSingleVessel(aisUpdateModel.Mmsi, aisUpdateModel.Imo); vessel.VesselId = aisUpdateModel.VesselId; if (vessel.IMO != aisUpdateModel.Imo) { throw new Exception("Received vessel imo differs from the one passed."); } while (_progress.GetIsUpdatingDatabase() || _progress.GetIsUpdatingPaused()) { await Task.Delay(100); } _progress.AddToReturnedResultsQuantity(); } } catch (Exception ex) { _progress.SetLastError(ex.Message); _progress.AddFailedRequest(); vessel = null; } finally { while (_progress.GetIsUpdatingDatabase() || _progress.GetIsUpdatingPaused()) { await Task.Delay(100); } semaphoreThrottel.Release(); } return(vessel); }
private void GetVesselUpdatesAsync_OnMmsiEqualZero_ReturnsNullAndCallsMethodsInFinallyOnce() { VesselAisUpdateModel updateModel = new VesselAisUpdateModel() { Mmsi = 0 }; Task <VesselUpdateModel> result = _service.GetVesselUpdatesAsync(updateModel, new CancellationToken(), new SemaphoreSlim(1)); Assert.Null(result.Result); _progressMock.Verify(mock => mock.GetIsUpdatingDatabase(), Times.Once()); _progressMock.Verify(mock => mock.GetIsUpdatingPaused(), Times.Once()); }
private void GetVesselUpdatesAsync_OnExceptionThrownByScrapSingleVessel_CallsMethodsInCatchOnce() { Exception ex = new Exception("some_exception"); _scrapperMock.Setup(mock => mock.ScrapSingleVessel(It.IsAny <int>(), It.IsAny <int>())).Throws(ex); VesselAisUpdateModel updateModel = new VesselAisUpdateModel() { Mmsi = 12345678, Speed = 0.1, Imo = _correctImo }; Task <VesselUpdateModel> result = _service.GetVesselUpdatesAsync(updateModel, new CancellationToken(), new SemaphoreSlim(1)); Assert.Null(result.Result); _progressMock.Verify(mock => mock.GetIsUpdatingDatabase(), Times.Once()); _progressMock.Verify(mock => mock.GetIsUpdatingPaused(), Times.Once()); _progressMock.Verify(mock => mock.AddFailedRequest(), Times.Once()); _progressMock.Verify(mock => mock.SetLastError(ex.Message), Times.Once()); }
public VesselAisUpdateModel GetVesselData(string searchQuery) { VesselAisUpdateModel existing = new VesselAisUpdateModel(); using (SqlConnection connection = GetConnection(_connectionString)) using (SqlCommand command = connection.CreateCommand()) { connection.Open(); command.CommandType = CommandType.Text; command.CommandText = searchQuery; using (SqlDataReader rdr = command.ExecuteReader()) { while (rdr.Read()) { existing.Mmsi = (int)rdr["MMSI"]; existing.SpeedMax = null; if (!string.IsNullOrEmpty(rdr["SpeedMax"].ToString())) { if (double.TryParse(rdr["SpeedMax"].ToString(), out double d)) { existing.SpeedMax = d; } } if (!string.IsNullOrEmpty(rdr["DraughtMax"].ToString())) { if (double.TryParse(rdr["DraughtMax"].ToString(), out double d)) { existing.DraughtMax = d; } } } } connection.Close(); } return existing; }
private void GetVesselUpdatesAsync_OnReceivedResultWithDifferentImo_ThrowsException() { int _incorrectImo = _correctImo - 1; Exception ex = new Exception("Received vessel imo differs from the one passed."); VesselAisUpdateModel updateModel = new VesselAisUpdateModel() { Imo = 9482469, Mmsi = 12345678, Speed = 0.1 }; VesselUpdateModel returnedModel = new VesselUpdateModel() { IMO = _incorrectImo }; _scrapperMock.Setup(mock => mock.ScrapSingleVessel(It.IsAny <int>(), It.IsAny <int>())).Returns(returnedModel); Task <VesselUpdateModel> result = _service.GetVesselUpdatesAsync(updateModel, new CancellationToken(), new SemaphoreSlim(1)); Assert.Null(result.Result); _progressMock.Verify(mock => mock.GetIsUpdatingDatabase(), Times.Once()); _progressMock.Verify(mock => mock.GetIsUpdatingPaused(), Times.Once()); _progressMock.Verify(mock => mock.AddFailedRequest(), Times.Once()); _progressMock.Verify(mock => mock.SetLastError(ex.Message), Times.Once()); }
private void GetVesselUpdatesAsync_OnCorrectVesselModel_ReturnsVesselUpdateModel() { VesselAisUpdateModel updateModel = new VesselAisUpdateModel() { Mmsi = 12345678, Speed = 0.1, Imo = _correctImo }; Task <VesselUpdateModel> result = _service.GetVesselUpdatesAsync(updateModel, new CancellationToken(), new SemaphoreSlim(1)); Assert.NotNull(result.Result); Assert.Equal(new DateTime(2020, 10, 02), result.Result.AISLatestActivity); Assert.Equal("some_status", result.Result.AISStatus); Assert.Equal(new DateTime(2020, 10, 03), result.Result.ETA); Assert.Equal(200.3, result.Result.Course); Assert.Equal(8.4, result.Result.Speed); Assert.Equal("some_port", result.Result.Destination); Assert.Equal(10.3, result.Result.Draught); Assert.Equal(9482469, result.Result.IMO); Assert.Equal(312619000, result.Result.MMSI); Assert.Equal(3.7294, result.Result.Lon); Assert.Equal(41.842, result.Result.Lat); _progressMock.Verify(mock => mock.GetIsUpdatingDatabase(), Times.Exactly(2)); _progressMock.Verify(mock => mock.GetIsUpdatingPaused(), Times.Exactly(2)); }
private string BuildSingleVesselQuery(VesselAisUpdateModel existingVessel, VesselUpdateModel update) { StringBuilder vesselQuerySb = new StringBuilder(); vesselQuerySb.Append("UPDATE dbo.Vessels SET IMO = '" + update.IMO + "'"); if (existingVessel.Mmsi == 0) { if (update.MMSI.HasValue) { vesselQuerySb.Append(" , MMSI = '" + update.MMSI + "'"); } } if (update.AISLatestActivity.HasValue) { vesselQuerySb.Append(" , AISLatestActivity = '" + update.AISLatestActivity.Value.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'"); } if (update.ETA.HasValue) { vesselQuerySb.Append(" , ETA = '" + update.ETA.Value.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'"); } if (update.Course.HasValue) { vesselQuerySb.Append(" , Course = '" + update.Course.Value.ToString("0.0", System.Globalization.CultureInfo.InvariantCulture) + "'"); } if (update.Lat.HasValue) { vesselQuerySb.Append(" , Lat = '" + update.Lat.Value.ToString("0.0000", System.Globalization.CultureInfo.InvariantCulture) + "'"); } if (update.Lon.HasValue) { vesselQuerySb.Append(" , Lon = '" + update.Lon.Value.ToString("0.0000", System.Globalization.CultureInfo.InvariantCulture) + "'"); } if (update.Speed.HasValue) { vesselQuerySb.Append(" , Speed = '" + update.Speed.Value.ToString("0.0", System.Globalization.CultureInfo.InvariantCulture) + "'"); if ((existingVessel.SpeedMax < update.Speed || existingVessel.SpeedMax == null) && update.Speed != 0) { vesselQuerySb.Append(" , SpeedMax = '" + update.Speed.Value.ToString("0.0", System.Globalization.CultureInfo.InvariantCulture) + "'"); } } if (update.Draught.HasValue) { vesselQuerySb.Append(" , Draught = '" + update.Draught.Value.ToString("0.0", System.Globalization.CultureInfo.InvariantCulture) + "'"); if ((existingVessel.DraughtMax < update.Draught || existingVessel.DraughtMax == null) && update.Draught != 0) { vesselQuerySb.Append(" , DraughtMax = '" + update.Draught.Value.ToString("0.0", System.Globalization.CultureInfo.InvariantCulture) + "'"); } } if (!string.IsNullOrEmpty(update.AISStatus)) { vesselQuerySb.Append(" , AISStatus = '" + _stringParser.MakeFirstCharactersToUpper(update.AISStatus) + "'"); } if (!string.IsNullOrEmpty(update.Destination)) { vesselQuerySb.Append(" , Destination = '" + _stringParser.MakeFirstCharactersToUpper(update.Destination) + "'"); } if (!string.IsNullOrEmpty(update.GeographicalArea)) { vesselQuerySb.Append(" , GeographicalArea = '" + update.GeographicalArea + "'"); } if (!string.IsNullOrEmpty(update.CurrnetPortLocode)) { vesselQuerySb.Append(" , CurrnetPortLocode = '" + update.CurrnetPortLocode + "'"); } vesselQuerySb.Append(" WHERE VesselId = " + existingVessel.VesselId + "; "); vesselQuerySb.AppendLine(); return(vesselQuerySb.ToString()); }