session_test.rb 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. require 'test_helper'
  2. class SessionTest < Test::Unit::TestCase
  3. context "Session" do
  4. should "not be valid without a url" do
  5. session = ShopifyAPI::Session.new(nil, "any-token")
  6. assert_not session.valid?
  7. end
  8. should "not be valid without token" do
  9. session = ShopifyAPI::Session.new("testshop.myshopify.com")
  10. assert_not session.valid?
  11. end
  12. should "be valid with any token and any url" do
  13. session = ShopifyAPI::Session.new("testshop.myshopify.com", "any-token")
  14. assert session.valid?
  15. end
  16. should "not raise error without params" do
  17. assert_nothing_raised do
  18. session = ShopifyAPI::Session.new("testshop.myshopify.com", "any-token")
  19. end
  20. end
  21. should "raise error if params passed but signature omitted" do
  22. assert_raises(RuntimeError) do
  23. session = ShopifyAPI::Session.new("testshop.myshopify.com")
  24. session.request_token({'code' => 'any-code'})
  25. end
  26. end
  27. should "setup api_key and secret for all sessions" do
  28. ShopifyAPI::Session.setup(:api_key => "My test key", :secret => "My test secret")
  29. assert_equal "My test key", ShopifyAPI::Session.api_key
  30. assert_equal "My test secret", ShopifyAPI::Session.secret
  31. end
  32. should "use 'https' protocol by default for all sessions" do
  33. assert_equal 'https', ShopifyAPI::Session.protocol
  34. end
  35. should "#temp reset ShopifyAPI::Base.site to original value" do
  36. ShopifyAPI::Session.setup(:api_key => "key", :secret => "secret")
  37. session1 = ShopifyAPI::Session.new('fakeshop.myshopify.com', 'token1')
  38. ShopifyAPI::Base.activate_session(session1)
  39. ShopifyAPI::Session.temp("testshop.myshopify.com", "any-token") {
  40. @assigned_site = ShopifyAPI::Base.site
  41. }
  42. assert_equal 'https://testshop.myshopify.com/admin', @assigned_site.to_s
  43. assert_equal 'https://fakeshop.myshopify.com/admin', ShopifyAPI::Base.site.to_s
  44. end
  45. should "create_permission_url returns correct url with single scope no redirect uri" do
  46. ShopifyAPI::Session.setup(:api_key => "My_test_key", :secret => "My test secret")
  47. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  48. scope = ["write_products"]
  49. permission_url = session.create_permission_url(scope)
  50. assert_equal "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&scope=write_products", permission_url
  51. end
  52. should "create_permission_url returns correct url with single scope and redirect uri" do
  53. ShopifyAPI::Session.setup(:api_key => "My_test_key", :secret => "My test secret")
  54. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  55. scope = ["write_products"]
  56. permission_url = session.create_permission_url(scope, "http://my_redirect_uri.com")
  57. assert_equal "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&scope=write_products&redirect_uri=http://my_redirect_uri.com", permission_url
  58. end
  59. should "create_permission_url returns correct url with dual scope no redirect uri" do
  60. ShopifyAPI::Session.setup(:api_key => "My_test_key", :secret => "My test secret")
  61. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  62. scope = ["write_products","write_customers"]
  63. permission_url = session.create_permission_url(scope)
  64. assert_equal "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&scope=write_products,write_customers", permission_url
  65. end
  66. should "create_permission_url returns correct url with no scope no redirect uri" do
  67. ShopifyAPI::Session.setup(:api_key => "My_test_key", :secret => "My test secret")
  68. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  69. scope = []
  70. permission_url = session.create_permission_url(scope)
  71. assert_equal "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&scope=", permission_url
  72. end
  73. should "raise exception if code invalid in request token" do
  74. ShopifyAPI::Session.setup(:api_key => "My test key", :secret => "My test secret")
  75. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  76. fake nil, :url => 'https://localhost.myshopify.com/admin/oauth/access_token',:method => :post, :status => 404, :body => '{"error" : "invalid_request"}'
  77. assert_raises(RuntimeError) do
  78. session.request_token(params={:code => "bad-code"})
  79. end
  80. assert_equal false, session.valid?
  81. end
  82. should "#temp reset ShopifyAPI::Base.site to original value when using a non-standard port" do
  83. ShopifyAPI::Session.setup(:api_key => "key", :secret => "secret")
  84. session1 = ShopifyAPI::Session.new('fakeshop.myshopify.com:3000', 'token1')
  85. ShopifyAPI::Base.activate_session(session1)
  86. ShopifyAPI::Session.temp("testshop.myshopify.com", "any-token") {
  87. @assigned_site = ShopifyAPI::Base.site
  88. }
  89. assert_equal 'https://testshop.myshopify.com/admin', @assigned_site.to_s
  90. assert_equal 'https://fakeshop.myshopify.com:3000/admin', ShopifyAPI::Base.site.to_s
  91. end
  92. should "return site for session" do
  93. session = ShopifyAPI::Session.new("testshop.myshopify.com", "any-token")
  94. assert_equal "https://testshop.myshopify.com/admin", session.site
  95. end
  96. should "return_token_if_signature_is_valid" do
  97. ShopifyAPI::Session.secret = 'secret'
  98. params = {:code => 'any-code', :timestamp => Time.now}
  99. sorted_params = make_sorted_params(params)
  100. signature = Digest::MD5.hexdigest(ShopifyAPI::Session.secret + sorted_params)
  101. fake nil, :url => 'https://testshop.myshopify.com/admin/oauth/access_token',:method => :post, :body => '{"access_token" : "any-token"}'
  102. session = ShopifyAPI::Session.new("testshop.myshopify.com")
  103. token = session.request_token(params.merge(:signature => signature))
  104. assert_equal "any-token", token
  105. end
  106. should "raise error if signature does not match expected" do
  107. ShopifyAPI::Session.secret = 'secret'
  108. params = {:code => "any-code", :timestamp => Time.now}
  109. sorted_params = make_sorted_params(params)
  110. signature = Digest::MD5.hexdigest(ShopifyAPI::Session.secret + sorted_params)
  111. params[:foo] = 'world'
  112. assert_raises(RuntimeError) do
  113. session = ShopifyAPI::Session.new("testshop.myshopify.com")
  114. session.request_token(params.merge(:signature => signature))
  115. end
  116. end
  117. should "raise error if timestamp is too old" do
  118. ShopifyAPI::Session.secret = 'secret'
  119. params = {:code => "any-code", :timestamp => Time.now - 2.days}
  120. sorted_params = make_sorted_params(params)
  121. signature = Digest::MD5.hexdigest(ShopifyAPI::Session.secret + sorted_params)
  122. params[:foo] = 'world'
  123. assert_raises(RuntimeError) do
  124. session = ShopifyAPI::Session.new("testshop.myshopify.com")
  125. session.request_token(params.merge(:signature => signature))
  126. end
  127. end
  128. private
  129. def make_sorted_params(params)
  130. sorted_params = params.except(:signature, :action, :controller).collect{|k,v|"#{k}=#{v}"}.sort.join
  131. end
  132. end
  133. end