Skip to content
This repository was archived by the owner on Jun 24, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions app/services/create_github_repo_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# rubocop:disable ClassLength
class CreateGitHubRepoService
attr_reader :exercise, :stats_sender
delegate :assignment, :collaborator, :organization, :invite_status, to: :exercise
delegate :assignment, :collaborator, :organization, :invite_status, :github_organization, to: :exercise

def initialize(assignment, collaborator)
@exercise = Exercise.build(assignment, collaborator)
Expand Down Expand Up @@ -60,7 +60,7 @@ def create_github_repository!
description: "#{exercise.repo_name} created by GitHub Classroom"
}

organization.github_organization.create_repository(exercise.repo_name, options)
github_organization.create_repository(exercise.repo_name, options)
rescue GitHub::Error => error
raise Result::Error.new errors(:repository_creation_failed), error.message
end
Expand All @@ -75,7 +75,7 @@ def create_github_repository_from_template!

options = repo_from_template_options

github_repository = organization.github_organization.create_repository_from_template(
github_repository = github_organization.create_repository_from_template(
assignment.starter_code_repo_id,
exercise.repo_name,
options
Expand Down Expand Up @@ -114,7 +114,7 @@ def create_assignment_repo!(github_repository)

def delete_github_repository(github_repo_id)
return true if github_repo_id.nil?
organization.github_organization.delete_repository(github_repo_id)
github_organization.delete_repository(github_repo_id)
rescue GitHub::Error
true
end
Expand Down Expand Up @@ -225,7 +225,7 @@ def repo_from_template_options
{
private: assignment.private?,
description: "#{exercise.repo_name} created by GitHub Classroom",
owner: organization.github_organization.login,
owner: github_organization.login,
include_all_branches: true
}
end
Expand Down
19 changes: 17 additions & 2 deletions app/services/create_github_repo_service/exercise.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@ def self.build(assignment, collaborator)
end
end

attr_reader :assignment, :collaborator, :organization, :invite_status
attr_reader :assignment, :collaborator, :organization, :invite_status, :github_organization
delegate :status, to: :invite_status

def initialize(assignment, collaborator)
@assignment = assignment
@collaborator = collaborator
@organization = assignment.organization
@invite_status = assignment.invitation.status(collaborator)
@github_organization = github_organization_with_access
end

def repo_name
Expand All @@ -29,7 +30,7 @@ def default_repo_name
end

def organization_login
@organization_login ||= organization.github_organization.login
@organization_login ||= @github_organization.login
end

def assignment_type
Expand Down Expand Up @@ -69,5 +70,19 @@ def suffixed_repo_name(suffix_count)
suffix = "-#{suffix_count}"
default_repo_name.truncate(100 - suffix.length, omission: "") + suffix
end

def github_organization_with_access
github_organization_with_random_token = @organization.github_organization
return github_organization_with_random_token unless assignment.starter_code?

GitHub::Errors.with_error_handling do
github_organization_with_random_token.client.repository(assignment.starter_code_repo_id)
end

github_organization_with_random_token
rescue GitHub::NotFound
github_client = assignment.creator.github_client
GitHubOrganization.new(github_client, assignment.starter_code_repo_id)
end
end
end
3 changes: 1 addition & 2 deletions spec/jobs/create_github_repository_new_job_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,7 @@
end

it "if #push_starter_code! fails" do
allow_any_instance_of(Assignment)
.to receive("starter_code?").and_return(true)
assignment.update(starter_code_repo_id: 1_062_897)
allow_any_instance_of(CreateGitHubRepoService)
.to receive(:push_starter_code!)
.and_raise(
Expand Down
74 changes: 73 additions & 1 deletion spec/services/create_github_repo_service/exercise_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,13 @@
let(:exercise) { described_class.new(assignment, student) }

describe ".build" do
let(:assignment) { double(organization: double, invitation: double(status: double)) }
let(:assignment) do
double(
organization: double(github_organization: double),
invitation: double(status: double),
starter_code?: false
)
end

it "builds a Individual if collaborator is a user" do
collaborator = double("is_a?": true)
Expand Down Expand Up @@ -40,4 +46,70 @@
expect(exercise.organization_login).to eq(organization.github_organization.login)
end
end

describe "#github_organization_with_access", :vcr do
let(:client) { oauth_client }
let(:organization) { classroom_org }
let(:github_organization) { organization.github_organization }
let(:teacher) { classroom_teacher }
let(:student) { classroom_student }
let(:assignment) do
options = {
title: "Learn Elm",
organization: organization,
students_are_repo_admins: true,
public_repo: true
}
build(:assignment, options)
end
let(:exercise) { described_class.new(assignment, student) }

before(:each) do
assignment.update(starter_code_repo_id: github_repository.id)
end

after(:each) do
teacher.github_client.delete_repository(github_repository.id)
end

context "repository is public" do
let(:github_repository) do
options = { private: false, is_template: true, auto_init: true }
github_organization.create_repository("#{Faker::Company.name} Public Template", options)
end

it "uses Organization#github_organization" do
exercise = described_class.new(assignment, student)
expect(exercise.github_organization).to eql(github_organization)
end
end

context "repository is private" do
context "repository belongs to classroom organization" do
let(:github_repository) do
options = { private: true, is_template: true, auto_init: true }
github_organization.create_repository("#{Faker::Company.name} Private Template on Org", options)
end

it "uses Organization#github_organization" do
exercise = described_class.new(assignment, student)
expect(exercise.github_organization).to eql(github_organization)
end
end

context "repository does not belong to classroom organization" do
let(:github_repository) do
options = { private: true, is_template: true, auto_init: true }
teacher.github_client.create_repository("#{Faker::Company.name} Private Template on User", options)
end

it "uses a new GitHubOrganization with the assignment creator's token" do
allow_any_instance_of(Octokit::Client).to receive(:repository).and_raise(GitHub::NotFound)
exercise = described_class.new(assignment, student)
expect(exercise.github_organization).not_to eql(github_organization)
expect(exercise.github_organization.access_token).to eql(assignment.creator.github_client.access_token)
end
end
end
end
end

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

This file was deleted.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

This file was deleted.

This file was deleted.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

This file was deleted.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

This file was deleted.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"http_interactions":[{"request":{"method":"get","uri":"https://api.github.com/organizations/\u003cTEST_CLASSROOM_OWNER_ORGANIZATION_GITHUB_ID\u003e","body":{"encoding":"US-ASCII","base64_string":""},"headers":{"Accept":["application/vnd.github.v3+json"],"User-Agent":["Octokit Ruby Gem 4.14.0"],"Content-Type":["application/json"],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Server":["GitHub.com"],"Date":["Thu, 22 Aug 2019 20:42:20 GMT"],"Content-Type":["application/json; charset=utf-8"],"Transfer-Encoding":["chunked"],"Status":["200 OK"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4832"],"X-Ratelimit-Reset":["1566509816"],"Cache-Control":["private, max-age=60, s-maxage=60"],"Vary":["Accept, Authorization, Cookie, X-GitHub-OTP"],"Etag":["W/\"aa746b40535032c23605a3bcb1f18886\""],"Last-Modified":["Tue, 13 Aug 2019 17:55:50 GMT"],"X-Oauth-Scopes":["admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, read:packages, repo, user, write:discussion, write:packages"],"X-Accepted-Oauth-Scopes":["admin:org, read:org, repo, user, write:org"],"X-Github-Media-Type":["github.v3; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Github-Request-Id":["E48D:5980:1607BE1:2CF68AF:5D5EFE2C"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJsb2dpbiI6IjxURVNUX0NMQVNTUk9PTV9PV05FUl9PUkdBTklaQVRJT05f\nR0lUSFVCX0xPR0lOPiIsImlkIjo8VEVTVF9DTEFTU1JPT01fT1dORVJfT1JH\nQU5JWkFUSU9OX0dJVEhVQl9JRD4sIm5vZGVfaWQiOiJNREV5T2s5eVoyRnVh\nWHBoZEdsdmJqVXdOakE1T0RJMyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1\nYi5jb20vb3Jncy88VEVTVF9DTEFTU1JPT01fT1dORVJfT1JHQU5JWkFUSU9O\nX0dJVEhVQl9MT0dJTj4iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRo\ndWIuY29tL29yZ3MvPFRFU1RfQ0xBU1NST09NX09XTkVSX09SR0FOSVpBVElP\nTl9HSVRIVUJfTE9HSU4+L3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8v\nYXBpLmdpdGh1Yi5jb20vb3Jncy88VEVTVF9DTEFTU1JPT01fT1dORVJfT1JH\nQU5JWkFUSU9OX0dJVEhVQl9MT0dJTj4vZXZlbnRzIiwiaG9va3NfdXJsIjoi\naHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLzxURVNUX0NMQVNTUk9PTV9P\nV05FUl9PUkdBTklaQVRJT05fR0lUSFVCX0xPR0lOPi9ob29rcyIsImlzc3Vl\nc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvPFRFU1RfQ0xB\nU1NST09NX09XTkVSX09SR0FOSVpBVElPTl9HSVRIVUJfTE9HSU4+L2lzc3Vl\ncyIsIm1lbWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdz\nLzxURVNUX0NMQVNTUk9PTV9PV05FUl9PUkdBTklaQVRJT05fR0lUSFVCX0xP\nR0lOPi9tZW1iZXJzey9tZW1iZXJ9IiwicHVibGljX21lbWJlcnNfdXJsIjoi\naHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLzxURVNUX0NMQVNTUk9PTV9P\nV05FUl9PUkdBTklaQVRJT05fR0lUSFVCX0xPR0lOPi9wdWJsaWNfbWVtYmVy\nc3svbWVtYmVyfSIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMwLmdp\ndGh1YnVzZXJjb250ZW50LmNvbS91LzxURVNUX0NMQVNTUk9PTV9PV05FUl9P\nUkdBTklaQVRJT05fR0lUSFVCX0lEPj92PTQiLCJkZXNjcmlwdGlvbiI6bnVs\nbCwiaXNfdmVyaWZpZWQiOmZhbHNlLCJoYXNfb3JnYW5pemF0aW9uX3Byb2pl\nY3RzIjp0cnVlLCJoYXNfcmVwb3NpdG9yeV9wcm9qZWN0cyI6dHJ1ZSwicHVi\nbGljX3JlcG9zIjoyMjAsInB1YmxpY19naXN0cyI6MCwiZm9sbG93ZXJzIjow\nLCJmb2xsb3dpbmciOjAsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29t\nLzxURVNUX0NMQVNTUk9PTV9PV05FUl9PUkdBTklaQVRJT05fR0lUSFVCX0xP\nR0lOPiIsImNyZWF0ZWRfYXQiOiIyMDE5LTA1LTE0VDA1OjIyOjA4WiIsInVw\nZGF0ZWRfYXQiOiIyMDE5LTA4LTEzVDE3OjU1OjUwWiIsInR5cGUiOiJPcmdh\nbml6YXRpb24iLCJ0b3RhbF9wcml2YXRlX3JlcG9zIjoxNDQsIm93bmVkX3By\naXZhdGVfcmVwb3MiOjE0NCwicHJpdmF0ZV9naXN0cyI6MCwiZGlza191c2Fn\nZSI6MTE2NDg5LCJjb2xsYWJvcmF0b3JzIjoyLCJiaWxsaW5nX2VtYWlsIjoi\ncGlja3VwQHV3aW5kc29yLmNhIiwiZGVmYXVsdF9yZXBvc2l0b3J5X3Blcm1p\nc3Npb24iOiJyZWFkIiwibWVtYmVyc19jYW5fY3JlYXRlX3JlcG9zaXRvcmll\ncyI6ZmFsc2UsInR3b19mYWN0b3JfcmVxdWlyZW1lbnRfZW5hYmxlZCI6ZmFs\nc2UsInBsYW4iOnsibmFtZSI6InRlYW0iLCJzcGFjZSI6OTc2NTYyNDk5LCJw\ncml2YXRlX3JlcG9zIjo5OTk5OTksImZpbGxlZF9zZWF0cyI6NSwic2VhdHMi\nOjV9fQ==\n"},"http_version":null},"recorded_at":"Thu, 22 Aug 2019 20:42:20 GMT"}],"recorded_with":"VCR 3.0.3"}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"http_interactions":[{"request":{"method":"get","uri":"https://api.github.com/organizations/\u003cTEST_CLASSROOM_OWNER_ORGANIZATION_GITHUB_ID\u003e","body":{"encoding":"US-ASCII","base64_string":""},"headers":{"Accept":["application/vnd.github.v3+json"],"User-Agent":["Octokit Ruby Gem 4.14.0"],"Content-Type":["application/json"],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Server":["GitHub.com"],"Date":["Thu, 22 Aug 2019 20:42:28 GMT"],"Content-Type":["application/json; charset=utf-8"],"Transfer-Encoding":["chunked"],"Status":["200 OK"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4818"],"X-Ratelimit-Reset":["1566509816"],"Cache-Control":["private, max-age=60, s-maxage=60"],"Vary":["Accept, Authorization, Cookie, X-GitHub-OTP"],"Etag":["W/\"aa746b40535032c23605a3bcb1f18886\""],"Last-Modified":["Tue, 13 Aug 2019 17:55:50 GMT"],"X-Oauth-Scopes":["admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, delete_repo, gist, notifications, read:packages, repo, user, write:discussion, write:packages"],"X-Accepted-Oauth-Scopes":["admin:org, read:org, repo, user, write:org"],"X-Github-Media-Type":["github.v3; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Github-Request-Id":["E49A:7CC8:6F6E9C:109B575:5D5EFE34"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJsb2dpbiI6IjxURVNUX0NMQVNTUk9PTV9PV05FUl9PUkdBTklaQVRJT05f\nR0lUSFVCX0xPR0lOPiIsImlkIjo8VEVTVF9DTEFTU1JPT01fT1dORVJfT1JH\nQU5JWkFUSU9OX0dJVEhVQl9JRD4sIm5vZGVfaWQiOiJNREV5T2s5eVoyRnVh\nWHBoZEdsdmJqVXdOakE1T0RJMyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1\nYi5jb20vb3Jncy88VEVTVF9DTEFTU1JPT01fT1dORVJfT1JHQU5JWkFUSU9O\nX0dJVEhVQl9MT0dJTj4iLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRo\ndWIuY29tL29yZ3MvPFRFU1RfQ0xBU1NST09NX09XTkVSX09SR0FOSVpBVElP\nTl9HSVRIVUJfTE9HSU4+L3JlcG9zIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8v\nYXBpLmdpdGh1Yi5jb20vb3Jncy88VEVTVF9DTEFTU1JPT01fT1dORVJfT1JH\nQU5JWkFUSU9OX0dJVEhVQl9MT0dJTj4vZXZlbnRzIiwiaG9va3NfdXJsIjoi\naHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLzxURVNUX0NMQVNTUk9PTV9P\nV05FUl9PUkdBTklaQVRJT05fR0lUSFVCX0xPR0lOPi9ob29rcyIsImlzc3Vl\nc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvPFRFU1RfQ0xB\nU1NST09NX09XTkVSX09SR0FOSVpBVElPTl9HSVRIVUJfTE9HSU4+L2lzc3Vl\ncyIsIm1lbWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdz\nLzxURVNUX0NMQVNTUk9PTV9PV05FUl9PUkdBTklaQVRJT05fR0lUSFVCX0xP\nR0lOPi9tZW1iZXJzey9tZW1iZXJ9IiwicHVibGljX21lbWJlcnNfdXJsIjoi\naHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLzxURVNUX0NMQVNTUk9PTV9P\nV05FUl9PUkdBTklaQVRJT05fR0lUSFVCX0xPR0lOPi9wdWJsaWNfbWVtYmVy\nc3svbWVtYmVyfSIsImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMwLmdp\ndGh1YnVzZXJjb250ZW50LmNvbS91LzxURVNUX0NMQVNTUk9PTV9PV05FUl9P\nUkdBTklaQVRJT05fR0lUSFVCX0lEPj92PTQiLCJkZXNjcmlwdGlvbiI6bnVs\nbCwiaXNfdmVyaWZpZWQiOmZhbHNlLCJoYXNfb3JnYW5pemF0aW9uX3Byb2pl\nY3RzIjp0cnVlLCJoYXNfcmVwb3NpdG9yeV9wcm9qZWN0cyI6dHJ1ZSwicHVi\nbGljX3JlcG9zIjoyMjAsInB1YmxpY19naXN0cyI6MCwiZm9sbG93ZXJzIjow\nLCJmb2xsb3dpbmciOjAsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29t\nLzxURVNUX0NMQVNTUk9PTV9PV05FUl9PUkdBTklaQVRJT05fR0lUSFVCX0xP\nR0lOPiIsImNyZWF0ZWRfYXQiOiIyMDE5LTA1LTE0VDA1OjIyOjA4WiIsInVw\nZGF0ZWRfYXQiOiIyMDE5LTA4LTEzVDE3OjU1OjUwWiIsInR5cGUiOiJPcmdh\nbml6YXRpb24iLCJ0b3RhbF9wcml2YXRlX3JlcG9zIjoxNDQsIm93bmVkX3By\naXZhdGVfcmVwb3MiOjE0NCwicHJpdmF0ZV9naXN0cyI6MCwiZGlza191c2Fn\nZSI6MTE2NDg5LCJjb2xsYWJvcmF0b3JzIjoyLCJiaWxsaW5nX2VtYWlsIjoi\ncGlja3VwQHV3aW5kc29yLmNhIiwiZGVmYXVsdF9yZXBvc2l0b3J5X3Blcm1p\nc3Npb24iOiJyZWFkIiwibWVtYmVyc19jYW5fY3JlYXRlX3JlcG9zaXRvcmll\ncyI6ZmFsc2UsInR3b19mYWN0b3JfcmVxdWlyZW1lbnRfZW5hYmxlZCI6ZmFs\nc2UsInBsYW4iOnsibmFtZSI6InRlYW0iLCJzcGFjZSI6OTc2NTYyNDk5LCJw\ncml2YXRlX3JlcG9zIjo5OTk5OTksImZpbGxlZF9zZWF0cyI6NSwic2VhdHMi\nOjV9fQ==\n"},"http_version":null},"recorded_at":"Thu, 22 Aug 2019 20:42:28 GMT"}],"recorded_with":"VCR 3.0.3"}