session_test.rb 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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", "any-token", {'foo' => 'bar'})
  24. end
  25. end
  26. should "setup api_key and secret for all sessions" do
  27. ShopifyAPI::Session.setup(:api_key => "My test key", :secret => "My test secret")
  28. assert_equal "My test key", ShopifyAPI::Session.api_key
  29. assert_equal "My test secret", ShopifyAPI::Session.secret
  30. end
  31. should "use 'https' protocol by default for all sessions" do
  32. assert_equal 'https', ShopifyAPI::Session.protocol
  33. end
  34. should "#temp reset ShopifyAPI::Base.site to original value" do
  35. ShopifyAPI::Session.setup(:api_key => "key", :secret => "secret")
  36. session1 = ShopifyAPI::Session.new('fakeshop.myshopify.com', 'token1')
  37. ShopifyAPI::Base.activate_session(session1)
  38. ShopifyAPI::Session.temp("testshop.myshopify.com", "any-token") {
  39. @assigned_site = ShopifyAPI::Base.site
  40. }
  41. assert_equal 'https://testshop.myshopify.com/admin', @assigned_site.to_s
  42. assert_equal 'https://fakeshop.myshopify.com/admin', ShopifyAPI::Base.site.to_s
  43. end
  44. should "create_permission_url returns correct url with single scope no redirect uri" do
  45. ShopifyAPI::Session.setup(:api_key => "My_test_key", :secret => "My test secret")
  46. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  47. scope = ["write_products"]
  48. permission_url = session.create_permission_url(scope)
  49. assert_equal "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&scope=write_products", permission_url
  50. end
  51. should "create_permission_url returns correct url with single scope and redirect uri" do
  52. ShopifyAPI::Session.setup(:api_key => "My_test_key", :secret => "My test secret")
  53. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  54. scope = ["write_products"]
  55. permission_url = session.create_permission_url(scope, "http://my_redirect_uri.com")
  56. 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
  57. end
  58. should "create_permission_url returns correct url with dual scope no redirect uri" do
  59. ShopifyAPI::Session.setup(:api_key => "My_test_key", :secret => "My test secret")
  60. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  61. scope = ["write_products","write_customers"]
  62. permission_url = session.create_permission_url(scope)
  63. assert_equal "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&scope=write_products,write_customers", permission_url
  64. end
  65. should "create_permission_url returns correct url with no scope no redirect uri" do
  66. ShopifyAPI::Session.setup(:api_key => "My_test_key", :secret => "My test secret")
  67. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  68. scope = []
  69. permission_url = session.create_permission_url(scope)
  70. assert_equal "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&scope=", permission_url
  71. end
  72. should "request token should get token" do
  73. ShopifyAPI::Session.setup(:api_key => "My test key", :secret => "My test secret")
  74. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  75. fake nil, :url => 'https://localhost.myshopify.com/admin/oauth/access_token',:method => :post, :body => '{"access_token" : "token"}'
  76. assert_equal "token", session.request_token("code")
  77. end
  78. should "raise exception if code invalid in request token" do
  79. ShopifyAPI::Session.setup(:api_key => "My test key", :secret => "My test secret")
  80. session = ShopifyAPI::Session.new('http://localhost.myshopify.com')
  81. fake nil, :url => 'https://localhost.myshopify.com/admin/oauth/access_token',:method => :post, :status => 404, :body => '{"error" : "invalid_request"}'
  82. assert_raises(RuntimeError) do
  83. session.request_token("bad_code")
  84. end
  85. assert_equal false, session.valid?
  86. end
  87. should "#temp reset ShopifyAPI::Base.site to original value when using a non-standard port" do
  88. ShopifyAPI::Session.setup(:api_key => "key", :secret => "secret")
  89. session1 = ShopifyAPI::Session.new('fakeshop.myshopify.com:3000', 'token1')
  90. ShopifyAPI::Base.activate_session(session1)
  91. ShopifyAPI::Session.temp("testshop.myshopify.com", "any-token") {
  92. @assigned_site = ShopifyAPI::Base.site
  93. }
  94. assert_equal 'https://testshop.myshopify.com/admin', @assigned_site.to_s
  95. assert_equal 'https://fakeshop.myshopify.com:3000/admin', ShopifyAPI::Base.site.to_s
  96. end
  97. should "return site for session" do
  98. session = ShopifyAPI::Session.new("testshop.myshopify.com", "any-token")
  99. assert_equal "https://testshop.myshopify.com/admin", session.site
  100. end
  101. should "raise error if signature does not match expected" do
  102. ShopifyAPI::Session.secret = 'secret'
  103. params = {:foo => 'hello', :foo => 'world', :timestamp => Time.now}
  104. sorted_params = params.except(:signature, :action, :controller).collect{|k,v|"#{k}=#{v}"}.sort.join
  105. signature = Digest::MD5.hexdigest(ShopifyAPI::Session.secret + sorted_params)
  106. session = ShopifyAPI::Session.new("testshop.myshopify.com", "any-token", params.merge(:signature => signature))
  107. end
  108. end
  109. end