appengine/flexible/pubsub/spec/pubsub_spec.rb (67 lines of code) (raw):
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require "rspec"
require "google/cloud/pubsub"
require "rack/test"
require "googleauth"
require "jwt"
describe "PubSub", type: :feature do
include Rack::Test::Methods
def app
Sinatra::Application
end
before :all do
ENV["PUBSUB_TOPIC"] = "flexible-topic" unless ENV["PUBSUB_TOPIC"]
ENV["PUBSUB_VERIFICATION_TOKEN"] = "abc123" unless ENV["PUBSUB_VERIFICATION_TOKEN"]
@topic_name = ENV["PUBSUB_TOPIC"]
@pubsub = Google::Cloud::Pubsub.new
topic = @pubsub.topic @topic_name
@pubsub.create_topic @topic_name if topic.nil?
require_relative "../app.rb"
end
it "returns what we expect" do
get "/"
expect(last_response.body).to include(
"Print CLAIMS:"
)
expect(last_response.body).to include(
"Messages received by this instance:"
)
end
it "accepts a publish" do
post "/publish", payload: "A Message"
expect(last_response.status).to eq 303
end
it "accepts a push" do
post "/pubsub/push?token=#{ENV["PUBSUB_VERIFICATION_TOKEN"]}",
JSON.generate({"message" => { "data" => Base64.encode64("A Message") }})
expect(last_response.status).to eq 200
end
it "accepts an authenticated push" do
public_cert_str = File.read "spec/fixtures/public_cert.pem"
key = OpenSSL::X509::Certificate.new(public_cert_str).public_key
key_info = Google::Auth::IDTokens::KeyInfo.new id: "test-key", key: key, algorithm: "RS256"
key_source = Google::Auth::IDTokens::StaticKeySource.new key_info
Google::Auth::IDTokens.instance_variable_set(:@oidc_key_source, key_source)
now = Time.now.to_i
jwt_payload = {
aud: 'example.com',
azp: '1234567890',
email: 'pubsub@example.iam.gserviceaccount.com',
email_verified: true,
iat: now - 60, # Prevent any flakiness that might come from clock skew.
exp: now + 3600,
iss: 'https://accounts.google.com',
sub: '1234567890'
}
private_key = OpenSSL::PKey::RSA.new File.read("spec/fixtures/private_key.pem")
jwt_token = JWT.encode jwt_payload, private_key, "RS256"
post "/pubsub/authenticated-push?token=#{ENV["PUBSUB_VERIFICATION_TOKEN"]}",
JSON.generate({ "message" => { "data" => Base64.encode64("A Message") } }),
{ "HTTP_AUTHORIZATION" => "Bearer #{jwt_token}" }
expect(last_response.status).to eq 200
end
after :all do
topic = @pubsub.topic @topic_name
topic&.delete
Google::Auth::IDTokens.forget_sources!
end
end