예제 #1
0
        /// <summary>
        ///		Puts the tracking response data into the common
        ///		<see cref="TrackingData"/> format.
        /// </summary>
        /// <returns>
        ///		Gets the <see cref="TrackingData"/> that contains the tracking
        ///		information for this response.
        /// </returns>
        public static TrackingData GetCommonTrackingData(string xml)
        {
            _log.Debug("Processing DHL tracking response data: " + xml);

            try
            {
                var td = new TrackingData();

                var xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(xml);

                var response = GetResponseCode(xmlDoc);
                //Response code 0 = Package found
                if (response.Key != 0)
                {
                    //Response code 1 = Not found, anything else should log the message
                    if(response.Key != 1)
                        _log.InfoFormat("Received a response code of {0} from DHL, message: {1}", response.Key, response.Value);
                    return null;
                }

                td.Activity = getActivities(xmlDoc);

                td.TrackerName = TRACKER_NAME;
                td.UsageRequirements = DhlTracker.USAGE_REQUIREMENTS;

                return td;
            }
            catch (Exception ex)
            {
                throw new ResponseParseException(xml, ex);
            }
        }
예제 #2
0
        private static TrackingData getSim2TrackingData()
        {
            var td = new TrackingData();
            td.UsageRequirements = "The simulation tracker is for internal use only";
            td.TrackerName = "Simulation Tracker";

            td.EstimatedDelivery = DateTime.Parse("1-7-15");
            td.Activity = new List<Activity>();

            DateTime baseTime = DateTime.Now;
            baseTime = baseTime.AddMinutes(-baseTime.Minute);

            var activity = new Activity();
            activity.Timestamp = baseTime.AddHours(-1);
            activity.ShortDescription = string.Format("Simulated activity at {0}", activity.Timestamp);
            activity.LocationDescription = "Simulated, SI";
            td.Activity.Add(activity);

            activity = new Activity();
            activity.Timestamp = baseTime;
            activity.ShortDescription = string.Format("Simulated activity at {0}", activity.Timestamp);
            activity.LocationDescription = "Simulated, SI";
            td.Activity.Add(activity);

            return td;
        }
 public void Non_Empty_Tracking_Number_Verify_Upstream_Tracker_Used()
 {
     var expectedTrackingData = new TrackingData();
     _mockUpstreamTracker.Expect(x => x.GetTrackingData("abc")).Return(expectedTrackingData);
     var td = _t.GetTrackingData("abc");
     Assert.AreEqual(td, expectedTrackingData);
 }
예제 #4
0
        public TrackingDataEntity(string trackingNumber, TrackingData trackingData)
        {
            PartitionKey = trackingNumber;
            RowKey = DateTime.UtcNow.ToString("O");

            TrackingNumber = trackingNumber;

            //What is the performance impact here?
            TrackingDataJson = JsonConvert.SerializeObject(trackingData);
        }
        public void UsesTrackingNumberUtilities()
        {
            var downstreamTracker = MockRepository.GenerateMock<ITracker>();
            var expectedTrackingData = new TrackingData();
            downstreamTracker.Expect(x => x.GetTrackingData("abc123")).Return(expectedTrackingData);

            var t = new TrackingNumberStandardizerTracker(downstreamTracker);
            var actualTrackingData = t.GetTrackingData("abc 123");

            downstreamTracker.VerifyAllExpectations();
        }
        public void UseDownstreamTracker()
        {
            var downstreamTracker = MockRepository.GenerateMock<ITracker>();
            var expectedTrackingData = new TrackingData();
            downstreamTracker.Expect(x => x.GetTrackingData("abc")).Return(expectedTrackingData);

            var t = new TrackingNumberStandardizerTracker(downstreamTracker);
            var actualTrackingData = t.GetTrackingData("abc");

            Assert.AreEqual(expectedTrackingData, actualTrackingData);
        }
예제 #7
0
        public void Pass_On_Valid_Tracking_Data()
        {
            var td = new TrackingData();
            _eht = new ErrorHandlerTracker(_mockTracker);

            Expect.Call(_mockTracker.GetTrackingData("Pass_On_Valid_Tracking_Data")).Return(td);

            _mocks.ReplayAll();

            Assert.AreEqual(td, _eht.GetTrackingData("Pass_On_Valid_Tracking_Data"));

            _mocks.VerifyAll();
        }
예제 #8
0
        public void One_Tracker_Verify_Pass_Through()
        {
            var td = new TrackingData();

            Expect.Call(_mt1.GetTrackingData("abc")).Return(td);

            _mocks.ReplayAll();

            _mt = new MultiTracker(new[] {_mt1});
            Assert.AreEqual(td, _mt.GetTrackingData("abc"));

            _mocks.VerifyAll();
        }
예제 #9
0
        /// <summary>
        ///		Gets simulated tracking data for certain tracking numbers.
        /// </summary>
        /// <param name="trackingNumber">
        ///		sim1: Passes back 2 activities, with basic tracking data.
        ///		sim2: Passes back tracking data that has 2 activities that are updated
        ///					every hour. This can be used to test RSS feeds or email data.
        /// </param>
        /// <returns></returns>
        public TrackingData GetTrackingData(string trackingNumber)
        {
            var td = new TrackingData();

            if (trackingNumber == "sim1")
                return getSim1TrackingData();
            if (trackingNumber == "sim2")
                return getSim2TrackingData();
            if (trackingNumber == "sim3")
                return getSim3TrackingData();

            return null;
        }
예제 #10
0
        public void No_Tracking_Data_Available()
        {
            var td = new TrackingData();

            Expect.Call(_mockTracker.GetTrackingData("abc")).Return(null).Repeat.Twice();

            _mocks.ReplayAll();

            _ct = new CacheTracker(_mockTracker);
            Assert.AreEqual(null, _ct.GetTrackingData("abc"));
            Assert.AreEqual(null, _ct.GetTrackingData("abc"));

            _mocks.VerifyAll();
        }
예제 #11
0
        public void Simple_Cache_Check()
        {
            var td = new TrackingData();

            Expect.Call(_mockTracker.GetTrackingData("abc")).Return(td);

            _mocks.ReplayAll();

            _ct = new CacheTracker(_mockTracker, TimeSpan.FromSeconds(10.0));
            _ct.GetTrackingData("abc"); //This should use the passed in tracker
            _ct.GetTrackingData("abc"); //This should use the cache

            _mocks.VerifyAll();
        }
예제 #12
0
        public void Try_Default_Cache_Time()
        {
            var td = new TrackingData();

            Expect.Call(_mockTracker.GetTrackingData("abc")).Return(td);

            _mocks.ReplayAll();

            _ct = new CacheTracker(_mockTracker);
            _ct.GetTrackingData("abc"); //This should use the passed in tracker
            _ct.GetTrackingData("abc"); //This should use the cache

            _mocks.VerifyAll();
        }
예제 #13
0
        public void Two_Trackers_Both_Work_Verify_Return_First()
        {
            var td = new TrackingData();
            var td2 = new TrackingData();

            Expect.Call(_mt1.GetTrackingData("abc")).Return(td);
            Expect.Call(_mt2.GetTrackingData("abc")).Return(td2);

            _mocks.ReplayAll();

            _mt = new MultiTracker(new[] {_mt1, _mt2});
            Assert.AreEqual(td, _mt.GetTrackingData("abc"));

            _mocks.VerifyAll();
        }
예제 #14
0
        public void Cache_Expired_Recheck_Tracker()
        {
            var td = new TrackingData();

            Expect.Call(_mockTracker.GetTrackingData("abc")).Return(td).Repeat.Twice();

            _mocks.ReplayAll();

            _ct = new CacheTracker(_mockTracker, TimeSpan.FromSeconds(1.0));
            _ct.GetTrackingData("abc"); //This should use the passed in tracker
            Thread.Sleep(2000);
            _ct.GetTrackingData("abc"); //This should use ask the pass in tracker again

            _mocks.VerifyAll();
        }
예제 #15
0
        /// <summary>
        ///		Converts the USPS XML response data into a <see cref="TrackingData"/> instance.
        /// </summary>
        /// <param name="xml">
        ///		The XML response from the API call.
        /// </param>
        /// <returns>
        ///		The XML parsed into a <see cref="TrackingData"/> instance.
        /// </returns>
        public static TrackingData GetCommonTrackingData(string xml)
        {
            _log.Debug("Processing USPS tracking response data: " + xml);

            try
            {
                var td = new TrackingData();
                td.Activity = GetActivities(xml);
                td.UsageRequirements = UsageRequirements;

                return td;
            }
            catch (Exception ex)
            {
                throw new ResponseParseException(xml, ex);
            }
        }
예제 #16
0
        private void StoreTrackingData(string trackingNumber, TrackingData trackingData)
        {
            //If we don't have an internet connection (offline dev), don't use storage
            if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
                return;

            var trackingNumberCacheConnectionString = WebConfigurationManager.AppSettings["TrackingNumberCacheConnectionString"];

            //Store some tracking numbers to test with
            var storageAccount = CloudStorageAccount.Parse(trackingNumberCacheConnectionString);
            var tableClient = storageAccount.CreateCloudTableClient();
            var table = tableClient.GetTableReference("trackrequests");

            //This only had to run 1 time
            //table.CreateIfNotExists();

            var data = new TrackingDataEntity(trackingNumber, trackingData);

            var insert = TableOperation.InsertOrReplace(data);
            table.BeginExecute(insert, new AsyncCallback(InsertComplete), table);
        }
예제 #17
0
        public void Test()
        {
            var baseTracker = A.Fake<ITracker>();
            var geocodeDb = A.Fake<IGeocodeDb>();

            var baseTrackingData = new TrackingData();
            baseTrackingData.Activity.Add(new Activity {LocationDescription = "Green Bay, WI"});
            baseTrackingData.Activity.Add(new Activity {LocationDescription = "Seattle, WA"});

            A.CallTo(() => baseTracker.GetTrackingData("abc")).Returns(baseTrackingData);
            A.CallTo(() => geocodeDb.GetCity("Green Bay", "WI")).Returns(new CityRecord() {Latitude = 10, Longitude = 11});
            A.CallTo(() => geocodeDb.GetCity("Seattle", "WA")).Returns(new CityRecord() { Latitude = 12, Longitude = 13 });

            var gt = new GeocodingTracker(baseTracker, geocodeDb);

            var td = gt.GetTrackingData("abc");
            Assert.AreEqual(10, td.Activity[0].Latitude);
            Assert.AreEqual(11, td.Activity[0].Longitude);
            Assert.AreEqual(12, td.Activity[1].Latitude);
            Assert.AreEqual(13, td.Activity[1].Longitude);
        }
예제 #18
0
        private static TrackingData getSim1TrackingData()
        {
            var td = new TrackingData();
            td.UsageRequirements = "The simulation tracker is for internal use only";
            td.TrackerName = "Simulation Tracker";

            td.EstimatedDelivery = DateTime.Parse("1-7-15");
            td.Activity = new List<Activity>();

            var activity = new Activity();
            activity.Timestamp = DateTime.Parse("1-6-15 1:30 am");
            activity.ShortDescription = "Picked Up";
            activity.LocationDescription = "Atlanta, GA";
            td.Activity.Add(activity);

            activity = new Activity();
            activity.Timestamp = DateTime.Parse("1-6-15 2:53 pm");
            activity.ShortDescription = "Processed";
            activity.LocationDescription = "Richmond, VA";
            td.Activity.Add(activity);

            return td;
        }
예제 #19
0
        public void Two_Trackers_One_Works_Verify_Pass_Through_2()
        {
            var td = new TrackingData();

            Expect.Call(_mt1.GetTrackingData("abc")).Return(null);
            Expect.Call(_mt2.GetTrackingData("abc")).Return(td);

            _mocks.ReplayAll();

            _mt = new MultiTracker(new[] {_mt1, _mt2});
            Assert.AreEqual(td, _mt.GetTrackingData("abc"));

            _mocks.VerifyAll();
        }
예제 #20
0
        /// <summary>
        ///		Gets the tracking data for the specified tracking number.
        /// </summary>
        /// <param name="trackingNumber">
        ///		The tracking number to get tracking data for.
        /// </param>
        /// <returns>
        /// </returns>
        public TrackingData GetTrackingData(string trackingNumber)
        {
            //Only track it if it's a valid FedEx express or ground number
            if (!IsFedExExpress(trackingNumber) && !IsFedExGround(trackingNumber) && !IsFedExSmartPost(trackingNumber))
                return null;

            var trackRequest = CreateTrackRequest(_key, _password, _accountNumber, _meterNumber, trackingNumber);

            //Note: If you get an exception creating the web service, open Reference.cs, and replace all [][]'s with []
            //Reference: http://brianseekford.com/index.php/2010/05/06/fedex-integration-address-service-unable-to-generate-a-temporary-class-parsedelement/
            //Reference: http://support.microsoft.com/kb/2486643

            var resp = _trackService.track(trackRequest);

            var td = new TrackingData
            {
                TrackerName = "FedEx",
            };

            //No activity, no data
            if(resp == null || resp.TrackDetails == null || resp.TrackDetails.Length == 0)
                return td;

            td.EstimatedDelivery = resp.TrackDetails[0].EstimatedDeliveryTimestamp;

            foreach (var evt in resp.TrackDetails[0].Events)
            {
                var a = new Activity();
                a.LocationDescription = evt.Address.GetFriendlyAddressString();
                a.ShortDescription = evt.EventDescription;
                a.Timestamp = evt.Timestamp;

                td.Activity.Add(a);
            }

            td.UsageRequirements = UsageRequirements;

            return td;
        }
예제 #21
0
 public void SetUp()
 {
     _td = new TrackingData();
 }
예제 #22
0
        /// <summary>
        ///		Puts the tracking response data into the common
        ///		<see cref="TrackingData"/> format.
        /// </summary>
        /// <returns>
        ///		Gets the <see cref="TrackingData"/> that contains the tracking
        ///		information for this response.
        /// </returns>
        public static TrackingData GetCommonTrackingData(string xml)
        {
            _log.Debug("Processing UPS tracking response data: " + xml);

            try
            {
                var td = new TrackingData();

                var xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(xml);

                //Verify that the shipment information is available
                //in the XML, if it isn't, they must not have any
                //tracking data yet.
                var node = xmlDoc.SelectSingleNode("/TrackResponse/Shipment");
                if (node == null)
                    return null;

                node = xmlDoc.SelectSingleNode("/TrackResponse/Shipment/ScheduledDeliveryDate/text()");
                if (node != null)
                    td.EstimatedDelivery = UpsFormatConversions.parseUpsDate(node.Value);

                var nodes = xmlDoc.SelectNodes("/TrackResponse/Shipment/ReferenceNumber/Value/text()");
                for (var i = 0; i < nodes.Count; i++)
                    td.ReferenceNumbers.Add(nodes[i].Value);

                node = xmlDoc.SelectSingleNode("/TrackResponse/Shipment/Service/Description/text()");
                if(node != null)
                    td.ServiceType = node.Value;

                node = xmlDoc.SelectSingleNode("/TrackResponse/Shipment/Package/PackageWeight/Weight/text()");
                if(node != null)
                    td.Weight = decimal.Parse(node.Value);

                td.Activity = getActivities(xmlDoc);

                td.TrackerName = SHIPPER_NAME;
                td.UsageRequirements = USAGE_REQUIREMENTS;

                td.LastUpdated = DateTime.Now;

                return td;
            }
            catch (Exception ex)
            {
                throw new ResponseParseException(xml, ex);
            }
        }
예제 #23
0
 public void SetUp()
 {
     _td = new TrackingData();
 }