You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

41 lines
2.7 KiB

ENV["RAILS_ENV"] = "test"
require_relative "../config/environment"
require "rails/test_help"
class PracticeTransferTest < ActionDispatch::IntegrationTest
setup do
@user=User.create!(email:"export@example.test",password:"secure-test-password-123",password_confirmation:"secure-test-password-123",api_token_digest:Digest::SHA256.hexdigest("test-transfer-token"))
@other=User.create!(email:"other-export@example.test",password:"secure-test-password-123",password_confirmation:"secure-test-password-123")
@entry=@user.entries.create!(date:"2024-06-15",praktikums_typ:"propädeutikum",entry_art:"Supervision",hours:1,minutes:31,distance_km:20,beschreibung:"Confidential description",kosten:120)
@other.entries.create!(date:"2024-06-15",praktikums_typ:"propädeutikum",entry_art:"Supervision",hours:9,minutes:0,distance_km:999)
@password="separate-transfer-passphrase"
@params={from:"2024-01-01",to:"2024-12-31",transfer_password:@password}
end
test "missing and non bearer tokens never select a user without a token" do
post "/api/v1/practice_transfer",params:@params
assert_response :unauthorized
post "/api/v1/practice_transfer",params:@params,headers:{"Authorization"=>"Basic test-transfer-token"}
assert_response :unauthorized
end
test "exports only own records, excludes descriptions by default and retains source identities" do
post "/api/v1/practice_transfer",params:@params,headers:{"Authorization"=>"Bearer test-transfer-token"}
assert_response :success
assert_includes response.headers["Cache-Control"],"no-store"
payload=ProfessionalTransferEnvelope.decrypt(response.body,@password)
assert_equal 2,payload["records"].length
assert_equal [@entry.id.to_s],payload["records"].map { |r| r["source_id"] }.uniq
assert payload["records"].all? { |r| r["description"].nil? }
assert payload["records"].all? { |r| r["duration_minutes"]==91 }
namespace=payload["source_namespace"]
post "/api/v1/practice_transfer",params:@params.merge(include_descriptions:true),headers:{"Authorization"=>"Bearer test-transfer-token"}
second=ProfessionalTransferEnvelope.decrypt(response.body,@password)
assert_equal namespace,second["source_namespace"]
assert_equal "Confidential description",second["records"].first["description"]
end
test "envelope rejects tampering and incorrect passwords" do
content=ProfessionalTransferEnvelope.encrypt({"value"=>42},@password)
assert_raises(ProfessionalTransferEnvelope::Invalid) { ProfessionalTransferEnvelope.decrypt(content,"wrong-transfer-password") }
envelope=JSON.parse(content);envelope["tag"]=Base64.strict_encode64("0"*16)
assert_raises(ProfessionalTransferEnvelope::Invalid) { ProfessionalTransferEnvelope.decrypt(JSON.generate(envelope),@password) }
end
end