public void GetNextFromQueueOfFeedsToSubmit_ReturnsFirstFeedSubmissionFromQueueForGivenRegionAndMerchantId() { var propertiesContainer = new FeedSubmissionPropertiesContainer("testFeedContent", "testFeedType"); var serializedPropertiesContainer = JsonConvert.SerializeObject(propertiesContainer); var merchantId1 = "test merchant id 1"; var feedSubmissionWithDifferentRegion = new FeedSubmissionEntry(serializedPropertiesContainer) { AmazonRegion = AmazonRegion.Europe, MerchantId = merchantId1, Id = 2, FeedSubmissionId = null, FeedSubmissionRetryCount = 0 }; var feedSubmissionWithSameRegionButDifferentMerchantId = new FeedSubmissionEntry(serializedPropertiesContainer) { AmazonRegion = AmazonRegion.Australia, MerchantId = merchantId1, Id = 2, FeedSubmissionId = null, FeedSubmissionRetryCount = 0 }; var feedSubmissionWithSameRegionAndMerchantId1 = new FeedSubmissionEntry(serializedPropertiesContainer) { AmazonRegion = AmazonRegion.Australia, MerchantId = _merchantId, Id = 3, FeedSubmissionId = null, FeedSubmissionRetryCount = 0 }; var feedSubmissionWithSameRegionAndMerchantId2 = new FeedSubmissionEntry(serializedPropertiesContainer) { AmazonRegion = AmazonRegion.Australia, MerchantId = _merchantId, Id = 4, FeedSubmissionId = null, FeedSubmissionRetryCount = 0 }; _feedSubmissionEntries.Add(feedSubmissionWithDifferentRegion); _feedSubmissionEntries.Add(feedSubmissionWithSameRegionButDifferentMerchantId); _feedSubmissionEntries.Add(feedSubmissionWithSameRegionAndMerchantId1); _feedSubmissionEntries.Add(feedSubmissionWithSameRegionAndMerchantId2); var feedSubmissionCallback = _feedSubmissionEntryService.GetNextFromQueueOfFeedsToSubmit(_merchantId, AmazonRegion.Australia); Assert.IsNotNull(feedSubmissionCallback); Assert.AreEqual(feedSubmissionWithSameRegionAndMerchantId1.Id, feedSubmissionCallback.Id); }
public void QueueFeed(IFeedSubmissionEntryService feedSubmissionService, FeedSubmissionPropertiesContainer propertiesContainer, string targetEventId = null, Dictionary <string, object> targetEventArgs = null) { try { if (propertiesContainer == null) { throw new ArgumentNullException(); } var serializedPropertiesContainer = JsonConvert.SerializeObject(propertiesContainer); var feedSubmission = new FeedSubmissionEntry(serializedPropertiesContainer) { AmazonRegion = _region, MerchantId = _merchantId, LastSubmitted = DateTime.MinValue, DateCreated = DateTime.UtcNow, IsProcessingComplete = false, HasErrors = false, SubmissionErrorData = null, FeedSubmissionRetryCount = 0, FeedSubmissionId = null, FeedType = propertiesContainer.FeedType, TargetHandlerId = targetEventId, TargetHandlerArgs = targetEventArgs == null ? null : JsonConvert.SerializeObject(targetEventArgs), InstanceId = _options?.EventPublishingOptions?.RestrictInvocationToOriginatingInstance?.HashedInstanceId, Details = new FeedSubmissionDetails { FeedContent = ZipHelper.CreateArchiveFromContent(propertiesContainer.FeedContent) } }; feedSubmissionService.Unlock(feedSubmission, "Unlocking single feed submission entry - newly created, ready for processing."); feedSubmissionService.Create(feedSubmission); feedSubmissionService.SaveChanges(); _logger.Debug($"The following feed was queued for submission to Amazon {feedSubmission.EntryIdentityDescription}."); } catch (Exception e) { _logger.Error(e.Message, e); } }
public void QueueFeed_WithNonEmptyArguments_CallsFeedSubmissionEntryServiceCreateOnceWithCorrectData() { var propertiesContainer = new FeedSubmissionPropertiesContainer("testFeedContent", "testFeedType"); var callbackMethod = new Action <Stream, object>((stream, o) => { _called = true; }); FeedSubmissionEntry feedSubmissionEntry = null; _feedSubmissionServiceMock.Setup(rrcsm => rrcsm.Create(It.IsAny <FeedSubmissionEntry>())) .Callback <FeedSubmissionEntry>((p) => { feedSubmissionEntry = p; }); _feedProcessor.QueueFeed(_feedSubmissionServiceMock.Object, propertiesContainer, "TargetHandlerId", new Dictionary <string, object> { { "k1", "v1" }, { "k2", "v2" } }); _feedSubmissionServiceMock.Verify(rrcsm => rrcsm.Create(It.IsAny <FeedSubmissionEntry>()), Times.Once); Assert.AreEqual(JsonConvert.SerializeObject(propertiesContainer), feedSubmissionEntry.FeedSubmissionData); Assert.AreEqual(AmazonRegion.Europe, feedSubmissionEntry.AmazonRegion); Assert.AreEqual("TargetHandlerId", feedSubmissionEntry.TargetHandlerId); Assert.AreEqual("{\"k1\":\"v1\",\"k2\":\"v2\"}", feedSubmissionEntry.TargetHandlerArgs); }
GetNextFromQueueOfFeedsToSubmit_ReturnsFirstFeedSubmissionFromQueueWithNullFeedSubmissionId_AndSkipsEntriesWithNonNullFeedSubmissionId() { var propertiesContainer = new FeedSubmissionPropertiesContainer("testFeedContent", "testFeedType"); var serializedPropertiesContainer = JsonConvert.SerializeObject(propertiesContainer); var feedSubmissionWithNonNullFeedSubmissionId1 = new FeedSubmissionEntry(serializedPropertiesContainer) { AmazonRegion = AmazonRegion.Europe, MerchantId = _merchantId, Id = 2, FeedSubmissionId = "testSubmissionId2", FeedSubmissionRetryCount = 0 }; var feedSubmissionWithNullFeedSubmissionId1 = new FeedSubmissionEntry(serializedPropertiesContainer) { AmazonRegion = AmazonRegion.Europe, MerchantId = _merchantId, Id = 3, FeedSubmissionId = null, FeedSubmissionRetryCount = 0 }; var feedSubmissionWithNullFeedSubmissionId2 = new FeedSubmissionEntry(serializedPropertiesContainer) { AmazonRegion = AmazonRegion.Europe, MerchantId = _merchantId, Id = 4, FeedSubmissionId = null, FeedSubmissionRetryCount = 0 }; _feedSubmissionEntries.Add(feedSubmissionWithNonNullFeedSubmissionId1); _feedSubmissionEntries.Add(feedSubmissionWithNullFeedSubmissionId1); _feedSubmissionEntries.Add(feedSubmissionWithNullFeedSubmissionId2); var feedSubmissionCallback = _feedSubmissionEntryService.GetNextFromQueueOfFeedsToSubmit(_merchantId, _region); Assert.IsNotNull(feedSubmissionCallback); Assert.AreEqual(feedSubmissionWithNullFeedSubmissionId1.Id, feedSubmissionCallback.Id); }
public void SubmitFeedToAmazon(IFeedSubmissionEntryService feedSubmissionService, FeedSubmissionEntry feedSubmission) { void HandleSubmitFeedSuccess(SubmitFeedResponse response) { var requestId = response?.ResponseHeaderMetadata?.RequestId ?? "unknown"; var timestamp = response?.ResponseHeaderMetadata?.Timestamp ?? "unknown"; feedSubmission.FeedSubmissionId = response?.SubmitFeedResult?.FeedSubmissionInfo?.FeedSubmissionId; feedSubmission.FeedSubmissionRetryCount = 0; _logger.Info($"AmazonMWS feed submission has succeeded for {feedSubmission.EntryIdentityDescription}. FeedSubmissionId:'{feedSubmission.FeedSubmissionId}'.", new RequestInfo(timestamp, requestId)); } void HandleMissingFeedSubmissionId() { feedSubmission.FeedSubmissionRetryCount++; _logger.Warn($"SubmitFeed did not generate a FeedSubmissionId for {feedSubmission.EntryIdentityDescription}. Feed submission will be retried. FeedSubmissionRetryCount is now : {feedSubmission.FeedSubmissionRetryCount}."); } void HandleNonFatalOrGenericException(Exception e) { feedSubmission.FeedSubmissionRetryCount++; feedSubmission.LastSubmitted = DateTime.UtcNow; _logger.Warn($"AmazonMWS SubmitFeed failed for {feedSubmission.EntryIdentityDescription}. Feed submission will be retried. FeedSubmissionRetryCount is now : {feedSubmission.FeedSubmissionRetryCount}.", e); } void HandleFatalException(Exception e) { feedSubmissionService.Delete(feedSubmission); _logger.Error($"AmazonMWS SubmitFeed failed for {feedSubmission.EntryIdentityDescription}. The entry will now be removed from queue", e); } var missingInformationExceptionMessage = "Cannot submit queued feed to amazon due to missing feed submission information"; if (feedSubmission == null) { throw new ArgumentNullException($"{missingInformationExceptionMessage}: Feed submission entry is null"); } if (feedSubmission.FeedSubmissionData == null) { throw new ArgumentNullException($"{missingInformationExceptionMessage}: Feed submission data is null"); } var feedContentZip = feedSubmission.Details?.FeedContent; if (feedContentZip == null) { throw new ArgumentNullException($"{missingInformationExceptionMessage}: Feed content is missing"); } if (string.IsNullOrEmpty(feedSubmission?.FeedType)) { throw new ArgumentException($"{missingInformationExceptionMessage}: Feed type is missing"); } _logger.Debug($"Attempting to submit the next feed in queue to Amazon: {feedSubmission.EntryIdentityDescription}."); var feedSubmissionData = feedSubmission.GetPropertiesContainer(); using (var stream = ZipHelper.ExtractArchivedSingleFileToStream(feedContentZip)) { var submitFeedRequest = new SubmitFeedRequest { Merchant = feedSubmission.MerchantId, FeedType = feedSubmission.FeedType, FeedContent = stream, MarketplaceIdList = feedSubmissionData.MarketplaceIdList == null ? null : new IdList { Id = feedSubmissionData.MarketplaceIdList }, PurgeAndReplace = feedSubmissionData.PurgeAndReplace ?? false, ContentMD5 = MD5ChecksumHelper.ComputeHashForAmazon(stream), }; if (!string.IsNullOrEmpty(_mWSAuthToken)) { submitFeedRequest.MWSAuthToken = _mWSAuthToken; } try { feedSubmissionService.Unlock(feedSubmission, "Unlocking single feed submission entry - finished attempt to submit feed to amazon."); feedSubmissionService.Update(feedSubmission); var response = _marketplaceWebServiceClient.SubmitFeed(submitFeedRequest); feedSubmission.LastSubmitted = DateTime.UtcNow; if (string.IsNullOrEmpty(response?.SubmitFeedResult?.FeedSubmissionInfo?.FeedSubmissionId)) { HandleMissingFeedSubmissionId(); } else { HandleSubmitFeedSuccess(response); } } catch (MarketplaceWebServiceException e) when(e.StatusCode == HttpStatusCode.BadRequest && IsAmazonErrorCodeFatal(e.ErrorCode)) { HandleFatalException(e); } catch (MarketplaceWebServiceException e) when(IsAmazonErrorCodeNonFatal(e.ErrorCode)) { HandleNonFatalOrGenericException(e); } catch (Exception e) { HandleNonFatalOrGenericException(e); } finally { stream.Dispose(); feedSubmissionService.SaveChanges(); } } }