From ba93400e6ba9e88cdb429bca7e94b2f329597d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Meny?= Date: Wed, 2 Feb 2022 12:10:00 +0000 Subject: [PATCH] Organisation import first draft --- app/services/import_service.rb | 5 ++++ app/services/storage_service.rb | 8 ++++++ spec/services/import_service_spec.rb | 17 ++++++++++++ spec/services/storage_service_spec.rb | 38 ++++++++++++++++++++++++--- 4 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 app/services/import_service.rb create mode 100644 spec/services/import_service_spec.rb diff --git a/app/services/import_service.rb b/app/services/import_service.rb new file mode 100644 index 000000000..28c8005a4 --- /dev/null +++ b/app/services/import_service.rb @@ -0,0 +1,5 @@ +class ImportService + def initialize(storage_service) + @storage_service = storage_service + end +end diff --git a/app/services/storage_service.rb b/app/services/storage_service.rb index 7a65dda82..0a23fc41f 100644 --- a/app/services/storage_service.rb +++ b/app/services/storage_service.rb @@ -8,6 +8,14 @@ class StorageService @client = create_client end + def list_files(folder) + file_list = [] + @client.list_objects_v2(bucket: @configuration.bucket_name, prefix: folder).each do |response| + file_list += response.contents.map(&:key) + end + file_list + end + def get_file_io(file_name) file_response = @client.get_object(bucket: @configuration.bucket_name, key: file_name) diff --git a/spec/services/import_service_spec.rb b/spec/services/import_service_spec.rb new file mode 100644 index 000000000..ebbdfa5c1 --- /dev/null +++ b/spec/services/import_service_spec.rb @@ -0,0 +1,17 @@ +require "rspec" + +describe ImportService do + let(:storage_service) { instance_double(StorageService) } + + context "when importing organisations" do + subject(:import_service) { described_class.new(storage_service) } + it "successfully create a new organisation if it does not exist" do + import_service.update_organisations() + # 1. call import with folder name + # 2. check that it calls storage lists files + # 3. check that it calls read file on each files + # 4. create a temporary organisation object + # 5. update/insert (upsert) organisation (settings?) + end + end +end diff --git a/spec/services/storage_service_spec.rb b/spec/services/storage_service_spec.rb index f05c071d8..9a9256d46 100644 --- a/spec/services/storage_service_spec.rb +++ b/spec/services/storage_service_spec.rb @@ -19,7 +19,7 @@ RSpec.describe StorageService do JSON end - context "when we create an S3 Service with no PaaS Configuration present" do + context "when we create a storage service with no PaaS Configuration present" do subject(:storage_service) { described_class.new(PaasConfigurationService.new, "random_instance") } it "raises an exception" do @@ -27,7 +27,7 @@ RSpec.describe StorageService do end end - context "when we create an S3 Service with an unknown instance name" do + context "when we create a storage service with an unknown instance name" do subject(:storage_service) { described_class.new(PaasConfigurationService.new, "random_instance") } before do @@ -39,7 +39,7 @@ RSpec.describe StorageService do end end - context "when we create an storage service with a valid instance name" do + context "when we create a storage service with a valid instance name" do subject(:storage_service) { described_class.new(PaasConfigurationService.new, instance_name) } before do @@ -64,7 +64,7 @@ RSpec.describe StorageService do end end - context "when we create an storage service and write a stubbed object" do + context "when we create a storage service and write a stubbed object" do subject(:storage_service) { described_class.new(PaasConfigurationService.new, instance_name) } let(:filename) { "my_file" } @@ -98,4 +98,34 @@ RSpec.describe StorageService do storage_service.write_file(filename, content) end end + + context "when we create a storage service and list files" do + subject(:storage_service) { described_class.new(PaasConfigurationService.new, instance_name) } + + let(:s3_client_stub) { Aws::S3::Client.new(stub_responses: true) } + + before do + allow(ENV).to receive(:[]) + allow(ENV).to receive(:[]).with("VCAP_SERVICES").and_return(vcap_services) + allow(Aws::S3::Client).to receive(:new).and_return(s3_client_stub) + end + + it "returns a list with all present file names in a given folder" do + expected_filenames = %w[my_folder/my_file1.xml my_folder/my_file2.xml] + s3_client_stub.stub_responses(:list_objects_v2, { + contents: [ + { + key: expected_filenames[0], + }, + { + key: expected_filenames[1], + }, + ], + }) + + filenames = storage_service.list_files("my_folder") + + expect(filenames).to eq(expected_filenames) + end + end end