Example #1
0
        public void Setup()
        {
            _options = new EasyMwsOptions();
            var propertiesContainer = new FeedSubmissionPropertiesContainer("testFeedContent", "testFeedType", false,
                                                                            new List <string>(MwsMarketplaceGroup.AmazonEurope().Select(m => m.Id)));
            var serializedPropertiesContainer = JsonConvert.SerializeObject(propertiesContainer);

            _feedSubmissionEntries = new List <FeedSubmissionEntry>
            {
                new FeedSubmissionEntry(serializedPropertiesContainer)
                {
                    Id = 2
                },
                new FeedSubmissionEntry(serializedPropertiesContainer)
                {
                    Id                = 1,
                    AmazonRegion      = AmazonRegion.Europe,
                    TargetHandlerId   = "TargetHandlerId",
                    TargetHandlerArgs = JsonConvert.SerializeObject(new Dictionary <string, object> {
                        { "key1", "value1" }
                    }),
                    FeedType           = propertiesContainer.FeedType,
                    FeedSubmissionData = JsonConvert.SerializeObject(propertiesContainer)
                }
            };

            _loggerMock = new Mock <IEasyMwsLogger>();
            _feedSubmissionCallbackRepoMock = new Mock <IFeedSubmissionEntryRepository>();
            _feedSubmissionCallbackRepoMock.Setup(x => x.GetAll()).Returns(_feedSubmissionEntries.AsQueryable());
            _feedSubmissionEntryService = new FeedSubmissionEntryService(_feedSubmissionCallbackRepoMock.Object, _options, _loggerMock.Object);
        }
 internal FeedSubmissionProcessor(AmazonRegion region, string merchantId, string mWSAuthToken, IMarketplaceWebServiceClient marketplaceWebServiceClient, IEasyMwsLogger logger, EasyMwsOptions options)
 {
     _region     = region;
     _merchantId = merchantId;
     _options    = options;
     _logger     = logger;
     _marketplaceWebServiceClient = marketplaceWebServiceClient;
     _mWSAuthToken = mWSAuthToken;
 }
Example #3
0
		public void GetNextFromQueueOfReportsToRequest_WithRetryPeriodTypeConfiguredAsGeometricProgression_AndNonInitialRetryCount_ReturnsReportRequestWithTheExpectedCompleteRetryPeriod()
		{
			var customOptions = new EasyMwsOptions();
			var testRequestRetryCount = 5;
			var minutesBetweenRetries = 60;
			var reportRequestWithRequestRetryPeriodIncomplete = new ReportRequestEntry
			{
				AmazonRegion = AmazonRegion.Europe,
				MerchantId = _merchantId,
				Id = 2,
				RequestReportId = null,
				ReportRequestRetryCount = testRequestRetryCount,
				LastAmazonRequestDate = DateTime.UtcNow.AddMinutes(-61)
			};
			customOptions.ReportRequestOptions.ReportRequestRetryInitialDelay = TimeSpan.FromMinutes(1);
			customOptions.ReportRequestOptions.ReportRequestRetryInterval = TimeSpan.FromMinutes(minutesBetweenRetries);
			customOptions.ReportRequestOptions.ReportRequestRetryType = RetryPeriodType.GeometricProgression;
			var reportRequestWithNoRetryPeriodComplete1 = new ReportRequestEntry
			{
				AmazonRegion = AmazonRegion.Europe,
				MerchantId = _merchantId,
				Id = 3,
				RequestReportId = null,
				ReportRequestRetryCount = testRequestRetryCount,
				LastAmazonRequestDate = DateTime.UtcNow.AddMinutes(-59)
			};
			var reportRequestWithNoRetryPeriodComplete2 = new ReportRequestEntry
			{
				AmazonRegion = AmazonRegion.Europe,
				MerchantId = _merchantId,
				Id = 4,
				RequestReportId = null,
				ReportRequestRetryCount = testRequestRetryCount,
				LastAmazonRequestDate = DateTime.UtcNow.AddMinutes(-(testRequestRetryCount * minutesBetweenRetries - 1))
			};
			var reportRequestWithNoRetryPeriodComplete3 = new ReportRequestEntry
			{
				AmazonRegion = AmazonRegion.Europe,
				MerchantId = _merchantId,
				Id = 5,
				RequestReportId = null,
				ReportRequestRetryCount = testRequestRetryCount,
				LastAmazonRequestDate = DateTime.UtcNow.AddMinutes(-(testRequestRetryCount * minutesBetweenRetries - 1))
			};

			_reportRequestEntries.Add(reportRequestWithRequestRetryPeriodIncomplete);
			_reportRequestEntries.Add(reportRequestWithNoRetryPeriodComplete1);
			_reportRequestEntries.Add(reportRequestWithNoRetryPeriodComplete2);
			_reportRequestEntries.Add(reportRequestWithNoRetryPeriodComplete3);

			_reportRequestEntryService = new ReportRequestEntryService(_reportRequestCallbackReportMock.Object, customOptions, _loggerMock.Object);

			var reportRequestCallback = _reportRequestEntryService.GetNextFromQueueOfReportsToRequest(_merchantId, _amazonRegion);

			Assert.AreEqual(reportRequestWithNoRetryPeriodComplete2.Id, reportRequestCallback.Id);
		}
Example #4
0
        /// <summary>
        /// Constructor to be used for UnitTesting/Mocking (in the absence of a dedicated DependencyInjection framework)
        /// </summary>
        internal EasyMwsClient(AmazonRegion region, string merchantId, string accessKeyId, string mwsSecretAccessKey, string mWSAuthToken,
                               IReportQueueingProcessor reportProcessor,
                               IFeedQueueingProcessor feedProcessor, IEasyMwsLogger easyMwsLogger,
                               EasyMwsOptions options)
            : this(region, merchantId, accessKeyId, mwsSecretAccessKey, mWSAuthToken, easyMwsLogger, options)
        {
            _reportProcessor = reportProcessor;
            _feedProcessor   = feedProcessor;

            RegisterEvents();
        }
Example #5
0
        internal FeedProcessor(AmazonRegion region, string merchantId, string mWSAuthToken, EasyMwsOptions options, IMarketplaceWebServiceClient mwsClient, IEasyMwsLogger logger)
        {
            _region     = region;
            _merchantId = merchantId;
            _options    = options;
            _logger     = logger;

            _callbackActivator = _callbackActivator ?? new CallbackActivator();

            _feedSubmissionProcessor = _feedSubmissionProcessor ?? new FeedSubmissionProcessor(_region, _merchantId, mWSAuthToken, mwsClient, _logger, _options);

            RegisterEvents();
        }
Example #6
0
        public void SetUp()
        {
            _options       = new EasyMwsOptions();
            _dbContext     = new EasyMwsContext();
            _loggerMock    = new Mock <IEasyMwsLogger>();
            _mwsClientMock = new Mock <IMarketplaceWebServiceClient>();
            var feedProcessorMock = new Mock <IFeedQueueingProcessor>();

            var reportProcessor = new ReportProcessor(_region, _merchantId, _mwsAuthToken, _options, _mwsClientMock.Object, _loggerMock.Object);

            _easyMwsClient = new EasyMwsClient(AmazonRegion.Europe, _merchantId, _mwsAuthToken, "test", "test", reportProcessor,
                                               feedProcessorMock.Object, _loggerMock.Object, _options);
        }
Example #7
0
        public void SetUp()
        {
            var options = new EasyMwsOptions();

            _reportRequestServiceMock        = new Mock <IReportRequestEntryService>();
            _marketplaceWebServiceClientMock = new Mock <IMarketplaceWebServiceClient>();
            _requestReportProcessor          = new Mock <IRequestReportProcessor>();
            _callbackActivatorMock           = new Mock <ICallbackActivator>();
            _loggerMock = new Mock <IEasyMwsLogger>();

            _callbackActivatorMock.Setup(cam => cam.SerializeCallback(It.IsAny <Action <Stream, object> >(), It.IsAny <object>()))
            .Returns(new Callback("", "", "", ""));

            _reportProcessor = new ReportProcessor(AmazonRegion.Europe, "testMerchantId1", "testMwsAuthToken", options,
                                                   _marketplaceWebServiceClientMock.Object, _requestReportProcessor.Object, _callbackActivatorMock.Object, _loggerMock.Object);
        }
Example #8
0
        public void SetUp()
        {
            var options = new EasyMwsOptions();

            _feedSubmissionServiceMock       = new Mock <IFeedSubmissionEntryService>();
            _marketplaceWebServiceClientMock = new Mock <IMarketplaceWebServiceClient>();
            _feedSubmissionProcessorMock     = new Mock <IFeedSubmissionProcessor>();
            _callbackActivatorMock           = new Mock <ICallbackActivator>();
            _loggerMock = new Mock <IEasyMwsLogger>();

            _callbackActivatorMock.Setup(cam => cam.SerializeCallback(It.IsAny <Action <Stream, object> >(), It.IsAny <object>()))
            .Returns(new Callback("", "", "", ""));

            _feedProcessor = new FeedProcessor(_amazonRegion, _merchantId, _mwsAuthToken, options, _marketplaceWebServiceClientMock.Object,
                                               _feedSubmissionProcessorMock.Object, _callbackActivatorMock.Object, _loggerMock.Object);
        }
        public void EntryInvocationRestrictionHelper_WithForceInvocationByOriginatingInstanceOptionSetToTrue_AndDefaultInstanceId_ReturnsCorrectEntries(bool allowInvocationByAnyInstance, int expectedNumberOfEntries)
        {
            _options = new EasyMwsOptions(useDefaultValues: true);
            _options.EventPublishingOptions.RestrictInvocationToOriginatingInstance.CustomInstanceId = null;
            _originatingInstanceHash = _options.EventPublishingOptions.RestrictInvocationToOriginatingInstance.HashedInstanceId;

            _reportRequestEntries = new List <ReportRequestEntry>
            {
                new ReportRequestEntry {
                    Id = 1, InstanceId = _originatingInstanceHash, InvokeCallbackRetryCount = 0
                },
                new ReportRequestEntry {
                    Id = 2, InstanceId = "non-originating-instance1-hash", InvokeCallbackRetryCount = 3
                },
                new ReportRequestEntry {
                    Id = 3, InstanceId = "non-originating-instance2-hash", InvokeCallbackRetryCount = 0
                },
                new ReportRequestEntry {
                    Id = 4, InstanceId = _originatingInstanceHash, InvokeCallbackRetryCount = 0
                },
            };

            _options.EventPublishingOptions.RestrictInvocationToOriginatingInstance.ForceInvocationByOriginatingInstance = true;
            _options.EventPublishingOptions.RestrictInvocationToOriginatingInstance.AllowInvocationByAnyInstanceIfInvocationFailedLimitReached = allowInvocationByAnyInstance;
            var allowedFailures = 2;

            _options.EventPublishingOptions.RestrictInvocationToOriginatingInstance.InvocationFailuresLimit = allowedFailures;

            var filteredEntries = EntryInvocationRestrictionHelper <ReportRequestEntry> .RestrictInvocationToOriginatingClientsIfEnabled(_reportRequestEntries, _options);

            CollectionAssert.AreNotEquivalent(_reportRequestEntries, filteredEntries);
            Assert.IsTrue(filteredEntries.Count == expectedNumberOfEntries);

            if (!allowInvocationByAnyInstance)
            {
                Assert.IsTrue(filteredEntries.All(e => e.InstanceId == _originatingInstanceHash));
            }
            else
            {
                Assert.IsTrue(
                    filteredEntries.Count(e => e.InstanceId == _originatingInstanceHash) == 2 &&
                    filteredEntries.Count(e => e.InstanceId != _originatingInstanceHash && e.InvokeCallbackRetryCount > allowedFailures) == 1);
            }
        }
Example #10
0
		public void GetNextFromQueueOfReportsToRequest_WithConfiguredTimeToWaitBeforeFirstRetry_AndInitialRetryCount_ReturnsReportRequestWithTheExpectedCompleteRetryPeriod()
		{
			var customOptions = new EasyMwsOptions();
			var reportRequestWithRequestRetryPeriodIncomplete = new ReportRequestEntry { AmazonRegion = AmazonRegion.Europe, MerchantId = _merchantId, Id = 2, RequestReportId = null, ReportRequestRetryCount = 1, LastAmazonRequestDate = DateTime.UtcNow.AddMinutes(-59) };
			customOptions.ReportRequestOptions.ReportRequestRetryInitialDelay = TimeSpan.FromMinutes(60);
			customOptions.ReportRequestOptions.ReportRequestRetryInterval = TimeSpan.FromMinutes(1);
			var reportRequestWithNoRetryPeriodComplete1 = new ReportRequestEntry { AmazonRegion = AmazonRegion.Europe, MerchantId = _merchantId, Id = 3, RequestReportId = null, ReportRequestRetryCount = 1, LastAmazonRequestDate = DateTime.UtcNow.AddMinutes(-61) };
			var reportRequestWithNoRetryPeriodComplete2 = new ReportRequestEntry { AmazonRegion = AmazonRegion.Europe, MerchantId = _merchantId, Id = 4, RequestReportId = null, ReportRequestRetryCount = 1, LastAmazonRequestDate = DateTime.UtcNow.AddMinutes(-61) };

			_reportRequestEntries.Add(reportRequestWithRequestRetryPeriodIncomplete);
			_reportRequestEntries.Add(reportRequestWithNoRetryPeriodComplete1);
			_reportRequestEntries.Add(reportRequestWithNoRetryPeriodComplete2);

			_reportRequestEntryService = new ReportRequestEntryService(_reportRequestCallbackReportMock.Object, customOptions, _loggerMock.Object);

			var reportRequestCallback = _reportRequestEntryService.GetNextFromQueueOfReportsToRequest(_merchantId, _amazonRegion);

			Assert.AreEqual(reportRequestWithNoRetryPeriodComplete1.Id, reportRequestCallback.Id);
		}
Example #11
0
		public void GetNextFromQueueOfReportsToRequest_ReturnsFirstReportRequestFromQueueWithNoRequestRetryCount_AndSkipsReportRequestsWithRequestRetryPeriodIncomplete()
		{
			var customOptions = new EasyMwsOptions();
			var reportRequestWithRequestRetryPeriodIncomplete = new ReportRequestEntry { AmazonRegion = AmazonRegion.Europe, MerchantId = _merchantId, Id = 2, RequestReportId = null, ReportRequestRetryCount = 1, LastAmazonRequestDate = DateTime.UtcNow.AddHours(-1) };
			customOptions.ReportRequestOptions.ReportRequestRetryInitialDelay = TimeSpan.FromHours(2);
			customOptions.ReportRequestOptions.ReportRequestRetryInterval = TimeSpan.FromHours(2);
			var reportRequestWithNoRequestRetryCount1 = new ReportRequestEntry { AmazonRegion = AmazonRegion.Europe, MerchantId = _merchantId, Id = 3, RequestReportId = null, ReportRequestRetryCount = 0, LastAmazonRequestDate = DateTime.MinValue };
			var reportRequestWithNoRequestRetryCount2 = new ReportRequestEntry { AmazonRegion = AmazonRegion.Europe, MerchantId = _merchantId, Id = 4, RequestReportId = null, ReportRequestRetryCount = 0, LastAmazonRequestDate = DateTime.MinValue };

			_reportRequestEntries.Add(reportRequestWithRequestRetryPeriodIncomplete);
			_reportRequestEntries.Add(reportRequestWithNoRequestRetryCount1);
			_reportRequestEntries.Add(reportRequestWithNoRequestRetryCount2);

			_reportRequestEntryService = new ReportRequestEntryService(_reportRequestCallbackReportMock.Object, customOptions, _loggerMock.Object);

			var reportRequestCallback =
				_reportRequestEntryService.GetNextFromQueueOfReportsToRequest(_merchantId, _amazonRegion);

			Assert.AreEqual(reportRequestWithNoRequestRetryCount1.Id, reportRequestCallback.Id);
		}
Example #12
0
        /// <param name="region">The region of the account. Required parameter. A finer grained region or country can be specified on a PropertiesContainer by specifying its marketplaceIdList constructor argument.</param>
        /// <param name="merchantId">Seller ID / Merchant ID. Required parameter.</param>
        /// <param name="accessKeyId">Amazon account access key. Required parameter. This key can either belong to a seller or to a developer account authorized by a seller. If the key belongs to a developer account authorized by the seller then also make sure to specify the MWSAuthToken argument.</param>
        /// <param name="mwsSecretAccessKey">Amazon account secret access key. Required parameter. This key can either belong to a seller or to a developer account authorized by a seller. If the key belongs to a developer account authorized by the seller then also make sure to specify the MWSAuthToken argument.</param>
        /// <param name="mwsAuthToken">MWS Authorization Token. Optional parameter. If the provided access keys belong to a developer account authorized by a seller, this argument is the MWS Authorization Token provided by the seller to the authorized developer.</param>
        /// <param name="easyMwsLogger">An optional IEasyMwsLogger instance that can provide access to logs. It is strongly recommended to use a logger implementation already existing in the EasyMws package.</param>
        /// <param name="options">Configuration options for EasyMwsClient</param>
        public EasyMwsClient(AmazonRegion region, string merchantId, string accessKeyId, string mwsSecretAccessKey, string mwsAuthToken = null,
                             IEasyMwsLogger easyMwsLogger = null, EasyMwsOptions options = null)
        {
            if (string.IsNullOrEmpty(merchantId) || string.IsNullOrEmpty(accessKeyId) ||
                string.IsNullOrEmpty(mwsSecretAccessKey))
            {
                throw new ArgumentNullException(
                          "One or more required parameters provided to initialize the EasyMwsClient were null or empty");
            }

            _amazonRegion = region;
            _merchantId   = merchantId;
            _options      = options ?? new EasyMwsOptions();

            _easyMwsLogger = easyMwsLogger ?? new EasyMwsLogger(isEnabled: false);
            var mwsClient = new MarketplaceWebServiceClient(accessKeyId, mwsSecretAccessKey, CreateConfig(_amazonRegion));

            _reportProcessor = _reportProcessor ?? new ReportProcessor(_amazonRegion, _merchantId, mwsAuthToken, _options, mwsClient, _easyMwsLogger);
            _feedProcessor   = _feedProcessor ?? new FeedProcessor(_amazonRegion, _merchantId, mwsAuthToken, _options, mwsClient, _easyMwsLogger);

            RegisterEvents();
        }
        public void Setup()
        {
            _options = new EasyMwsOptions(useDefaultValues: true);
            _options.EventPublishingOptions.RestrictInvocationToOriginatingInstance.CustomInstanceId = _originatingInstance;
            _originatingInstanceHash = _options.EventPublishingOptions.RestrictInvocationToOriginatingInstance.HashedInstanceId;

            _reportRequestEntries = new List <ReportRequestEntry>
            {
                new ReportRequestEntry {
                    Id = 1, InstanceId = _originatingInstanceHash, InvokeCallbackRetryCount = 0
                },
                new ReportRequestEntry {
                    Id = 2, InstanceId = "non-originating-instance1-hash", InvokeCallbackRetryCount = 3
                },
                new ReportRequestEntry {
                    Id = 3, InstanceId = "non-originating-instance2-hash", InvokeCallbackRetryCount = 0
                },
                new ReportRequestEntry {
                    Id = 4, InstanceId = _originatingInstanceHash, InvokeCallbackRetryCount = 0
                },
            };
        }
Example #14
0
        /// <summary>
        /// Constructor to be used for UnitTesting/Mocking (in the absence of a dedicated DependencyInjection framework)
        /// </summary>
        internal FeedProcessor(AmazonRegion region, string merchantId, string mWSAuthToken, EasyMwsOptions options, IMarketplaceWebServiceClient mwsClient, IFeedSubmissionProcessor feedSubmissionProcessor, ICallbackActivator callbackActivator, IEasyMwsLogger logger)
            : this(region, merchantId, mWSAuthToken, options, mwsClient, logger)
        {
            _feedSubmissionProcessor = feedSubmissionProcessor;
            _callbackActivator       = callbackActivator;

            RegisterEvents();
        }
 internal FeedSubmissionEntryService(IFeedSubmissionEntryRepository feedSubmissionRepo, EasyMwsOptions options = null,
                                     IEasyMwsLogger logger = null) : this(options, logger)
     => (_feedRepo) = (feedSubmissionRepo);
 internal ReportRequestEntryService(IReportRequestEntryRepository reportRequestEntryRepository, EasyMwsOptions options = null, IEasyMwsLogger logger = null) : this(options, logger)
     => (_reportRequestEntryRepository) = (reportRequestEntryRepository);
Example #17
0
        internal static List <T> RestrictInvocationToOriginatingClientsIfEnabled(IEnumerable <IRestrictionableInvocationEntry> entries, EasyMwsOptions options)
        {
            var invocationRestrictionOptions = options?.EventPublishingOptions?.RestrictInvocationToOriginatingInstance;

            if (invocationRestrictionOptions == null || !invocationRestrictionOptions.ForceInvocationByOriginatingInstance)
            {
                // return the unaltered set of entries
                return(entries.Select(e => (T)e).ToList());
            }

            var entriesEligibleForCallbackInvocation = entries.Where(e => e.InstanceId == invocationRestrictionOptions.HashedInstanceId).ToList();

            if (!invocationRestrictionOptions.AllowInvocationByAnyInstanceIfInvocationFailedLimitReached)
            {
                // restrict callback invocation to clients matching the current hashedInstanceId
                return(entriesEligibleForCallbackInvocation.Select(e => (T)e).ToList());
            }
            else
            {
                // allow any client to attempt callback invocation if the configured amount of invocation failures have happened
                var entriesWithInvocationFailureLimitReached = entries.Where(e =>
                                                                             e.InvokeCallbackRetryCount >= invocationRestrictionOptions.InvocationFailuresLimit &&
                                                                             e.InstanceId != invocationRestrictionOptions.HashedInstanceId).ToList();
                entriesEligibleForCallbackInvocation.AddRange(entriesWithInvocationFailureLimitReached);

                return(entriesEligibleForCallbackInvocation.Select(e => (T)e).ToList());
            }
        }
Example #18
0
        /// <summary>
        /// Constructor to be used for UnitTesting/Mocking (in the absence of a dedicated DependencyInjection framework)
        /// </summary>
        internal ReportProcessor(AmazonRegion region, string merchantId, string mWSAuthToken, EasyMwsOptions options,
                                 IMarketplaceWebServiceClient mwsClient,
                                 IRequestReportProcessor requestReportProcessor, ICallbackActivator callbackActivator, IEasyMwsLogger logger)
            : this(region, merchantId, mWSAuthToken, options, mwsClient, logger)
        {
            _requestReportProcessor = requestReportProcessor;
            _callbackActivator      = callbackActivator;

            RegisterEvents();
        }