# encoding: utf-8 require 'test_helper' require 'stream_wrapper' include StreamWrapper class StreamWrapper::OrderBlobSplitterTest < Test::Unit::TestCase PICK_ITEM = %Q{81.225.100.141 - - [23/Nov/2009:06:26:04 +0100] "GET /log.gif?_item_id=3895&a=Mozilla%2F4.0%20(compatible%3B%20MSIE%207.0%3B%20Windows%20NT%205.1%3B%20Mozilla%2F4.0%20(compatible%3B%20MSIE%206.0%3B%20Windows%20NT%205.1%3B%20SV1)%20%3B%20.NET%20CLR%201.1.4322%3B%20.NET%20CLR%202.0.50727%3B%20.NET%20CLR%203.0.4506.2152%3B%20.NET%20CLR%203.5.30729%3B%20InfoPath.2)&aid=jetshop&e=click&l=sv&n=microsoft%20internet%20explorer&o=pick_item&p=win32&r=http%3A%2F%2Fwww.24.se%2Fsandisk-micro-secure-digital-2gb-p-1485.aspx&s=1024x768&sid=www.24.se&t=Sandisk%20MicroSD%20HC%208GB&u=http%3A%2F%2Fwww.24.se%2Fsandisk-microsd-hc-8gb-p-3895.aspx&uid=1258953499669667731&x=28543&z=-60& HTTP/1.1" 200 35 "http://www.24.se/sandisk-microsd-hc-8gb-p-3895.aspx" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)"\n} BUY_BASKET = %Q{81.225.100.141 - - [23/Nov/2009:06:45:23 +0100] "GET /log.gif?_order_blob=RW%3AT%7C2142%7C%7C1079.00%7C215.80%7C0.00%7Cstr%C3%B6mstad%7C%7CSweden%7C%20%0ARW%3AI%7C2142%7CMATAW09%20Wanni%20L%7COverall%20(98)%7C%7C1079.00%7C1%7C&a=Mozilla%2F4.0%20(compatible%3B%20MSIE%208.0%3B%20Windows%20NT%205.1%3B%20Trident%2F4.0%3B%20Mozilla%2F4.0%20(compatible%3B%20MSIE%206.0%3B%20Windows%20NT%205.1%3B%20SV1)%20%3B%20.NET%20CLR%202.0.50727%3B%20.NET%20CLR%203.0.4506.2152%3B%20.NET%20CLR%203.5.30729)&aid=jetshop&l=sv&n=microsoft%20internet%20explorer&o=buy_basket&p=win32&s=1024x600&sid=www.pixiekids.se&t=Unika%20barnkl%C3%A4der%20%26%20babykl%C3%A4der%20hos%20Pixiekids%20%E2%8E%AE%200-10%20%C3%A5r&u=https%3A%2F%2Fwww.pixiekids.se%2FOrderDetailsConfirmed.aspx&uid=1258954551578656003&x=87544&z=-60& HTTP/1.1" 200 35 "https://www.pixiekids.se/OrderDetailsConfirmed.aspx" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"\n} BUY_BASKET_WITH_2_ITEMS = %Q{81.225.100.141 - - [23/Nov/2009:06:45:23 +0100] "GET /log.gif?_order_blob=RW%3AT%7C2142%7C%7C1079.00%7C215.80%7C0.00%7Cstr%C3%B6mstad%7C%7CSweden%7C%20%0ARW%3AI%7C2142%7CMATAW09%20Wanni%20L%7COverall%20(98)%7C%7C1079.00%7C1%7CRW%3AI%7C2142%7CMATAW09%20Wanni%20L%7COverall%20(98)%7C%7C1079.00%7C1%7C&a=Mozilla%2F4.0%20(compatible%3B%20MSIE%208.0%3B%20Windows%20NT%205.1%3B%20Trident%2F4.0%3B%20Mozilla%2F4.0%20(compatible%3B%20MSIE%206.0%3B%20Windows%20NT%205.1%3B%20SV1)%20%3B%20.NET%20CLR%202.0.50727%3B%20.NET%20CLR%203.0.4506.2152%3B%20.NET%20CLR%203.5.30729)&aid=jetshop&l=sv&n=microsoft%20internet%20explorer&o=buy_basket&p=win32&s=1024x600&sid=www.pixiekids.se&t=Unika%20barnkl%C3%A4der%20%26%20babykl%C3%A4der%20hos%20Pixiekids%20%E2%8E%AE%200-10%20%C3%A5r&u=https%3A%2F%2Fwww.pixiekids.se%2FOrderDetailsConfirmed.aspx&uid=1258954551578656003&x=87544&z=-60& HTTP/1.1" 200 35 "https://www.pixiekids.se/OrderDetailsConfirmed.aspx" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"\n} EXPANDED_BUY_BASKET = %Q{81.225.100.141 - - [23/Nov/2009:06:45:23 +0100] "GET /log.gif?_city=str%C3%B6mstad&_country=Sweden&_order_blob=RW%3AT%7C2142%7C%7C1079.00%7C215.80%7C0.00%7Cstr%C3%B6mstad%7C%7CSweden%7C%20%0ARW%3AI%7C2142%7CMATAW09%20Wanni%20L%7COverall%20(98)%7C%7C1079.00%7C1%7C&_order_id=2142&_shipping=0.00&_tax=215.80&_total=1079.00&a=Mozilla%2F4.0%20(compatible%3B%20MSIE%208.0%3B%20Windows%20NT%205.1%3B%20Trident%2F4.0%3B%20Mozilla%2F4.0%20(compatible%3B%20MSIE%206.0%3B%20Windows%20NT%205.1%3B%20SV1)%20%3B%20.NET%20CLR%202.0.50727%3B%20.NET%20CLR%203.0.4506.2152%3B%20.NET%20CLR%203.5.30729)&aid=jetshop&l=sv&n=microsoft%20internet%20explorer&o=buy_basket&p=win32&s=1024x600&sid=www.pixiekids.se&t=Unika%20barnkl%C3%A4der%20%26%20babykl%C3%A4der%20hos%20Pixiekids%20%E2%8E%AE%200-10%20%C3%A5r&u=https%3A%2F%2Fwww.pixiekids.se%2FOrderDetailsConfirmed.aspx&uid=1258954551578656003&x=87544&z=-60& HTTP/1.1" 200 35 "https://www.pixiekids.se/OrderDetailsConfirmed.aspx" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"\n} BUY_ITEM = %Q{81.225.100.141 - - [23/Nov/2009:06:45:23 +0100] "GET /log.gif?_current_price=1079.00&_order_id=2142&_quantity=1&_sku=MATAW09+Wanni+L&_title=Overall+%2898%29&a=Mozilla%2F4.0%20(compatible%3B%20MSIE%208.0%3B%20Windows%20NT%205.1%3B%20Trident%2F4.0%3B%20Mozilla%2F4.0%20(compatible%3B%20MSIE%206.0%3B%20Windows%20NT%205.1%3B%20SV1)%20%3B%20.NET%20CLR%202.0.50727%3B%20.NET%20CLR%203.0.4506.2152%3B%20.NET%20CLR%203.5.30729)&aid=jetshop&l=sv&n=microsoft%20internet%20explorer&o=buy_item&p=win32&s=1024x600&sid=www.pixiekids.se&t=Unika%20barnkl%C3%A4der%20%26%20babykl%C3%A4der%20hos%20Pixiekids%20%E2%8E%AE%200-10%20%C3%A5r&u=https%3A%2F%2Fwww.pixiekids.se%2FOrderDetailsConfirmed.aspx&uid=1258954551578656003&x=87544&z=-60& HTTP/1.1" 200 35 "https://www.pixiekids.se/OrderDetailsConfirmed.aspx" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"\n} context "An OrderBlobSplitter" do should "not report eof unless stream is eof" do s = OrderBlobSplitter.new("oneline\n") assert(!s.eof?) s.gets assert(s.eof?) end should "handle an empty stream" do s = OrderBlobSplitter.new("") assert(s.eof?) assert_equal(nil, s.gets) end should "pass a nonsense line right through" do s = OrderBlobSplitter.new("apa") assert_equal("apa", s.gets) end should "just let non buy_baskets through unmodified" do s = OrderBlobSplitter.new(PICK_ITEM + PICK_ITEM) assert_equal(PICK_ITEM, s.gets) assert_equal(PICK_ITEM, s.gets) assert(s.eof?) end should "expand a buy_basket with attributes from an order_blob" do s = OrderBlobSplitter.new(BUY_BASKET) assert_equal(EXPANDED_BUY_BASKET, s.gets) assert(s.eof?) end should "add one buy_item line for an order_blob with an item" do s = OrderBlobSplitter.new(BUY_BASKET) s.gets # EXPANDED_BUY_BASKET assert_equal(BUY_ITEM, s.gets) assert(s.eof?) end should "add one buy_item for each item in an order_blob with two items" do s = OrderBlobSplitter.new(BUY_BASKET_WITH_2_ITEMS) s.gets # EXPANDED_BUY_BASKET assert_equal(BUY_ITEM, s.gets) assert_equal(BUY_ITEM, s.gets) assert_equal(nil, s.gets) assert(s.eof?) end context "with private method" do setup do @s = OrderBlobSplitter.new("") end context "extract_order_blob" do should "know extract the blob if it is there" do blob = @s.send(:extract_order_blob, BUY_BASKET) assert_equal(%Q{RW:T|2142||1079.00|215.80|0.00|strömstad||Sweden| \nRW:I|2142|MATAW09 Wanni L|Overall (98)||1079.00|1|}, blob) end should "return an empty string if there is no blob" do blob = @s.send(:extract_order_blob, PICK_ITEM) assert_equal("", blob) end end context "insert_user_attributes" do should "return the same string if no attributes are given." do line = @s.send(:insert_user_attributes, BUY_BASKET, {}) assert_equal(BUY_BASKET, line) end should "add parameters in alphabetic order" do line = @s.send(:insert_user_attributes, "...?_aa=11&_dd=44&aid=...", {:cc => "33", :bb => "22"}) assert_equal("...?_aa=11&_bb=22&_cc=33&_dd=44&aid=...", line) end should "encode keys" do line = @s.send(:insert_user_attributes, "...?_a=1&aid=...", {"|".to_sym => "a"}) assert_equal("...?_%7C=a&_a=1&aid=...", line) end should "encode values" do line = @s.send(:insert_user_attributes, "...?_a=1&aid=...", {:b => "|"}) assert_equal("...?_a=1&_b=%7C&aid=...", line) end should "not include empty values" do line = @s.send(:insert_user_attributes, "...?_a=1&aid=...", {:b => "", :c => nil}) assert_equal("...?_a=1&aid=...", line) end should "overwite attributes found in the line" do line = @s.send(:insert_user_attributes, "...?_a=1&aid=...", {:a => "2"}) assert_equal("...?_a=2&aid=...", line) end should "let through multiple values for an attribute in the line" do line = @s.send(:insert_user_attributes, "...?_a=1&_a=1&aid=...", {}) assert_equal("...?_a=1&_a=1&aid=...", line) end should "replace multiple values for an attribute in the line" do line = @s.send(:insert_user_attributes, "...?_a=1&_a=1&aid=...", {:a => "2"}) assert_equal("...?_a=2&aid=...", line) end context "in replace mode" do should "return an observation with no user attributes if none are given." do line = @s.send(:insert_user_attributes, "...?_aa=11&_dd=44&aid=...", {}, :replace) assert_equal("...?aid=...", line) end should "add parameters in alphabetic order without old parameters" do line = @s.send(:insert_user_attributes, "...?_aa=11&_dd=44&aid=...", {:cc => "33", :bb => "22"}, :replace) assert_equal("...?_bb=22&_cc=33&aid=...", line) end end end end end end