Skip to content

Commit

Permalink
Refactor project creation rake task and test (#675)
Browse files Browse the repository at this point in the history
* Remove duplicate metadata field

* Really connect to mediaflux

* Refactor test to really use mediaflux
  • Loading branch information
bess authored May 2, 2024
1 parent 179d160 commit 6cfe7f8
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 48 deletions.
2 changes: 2 additions & 0 deletions app/models/mediaflux/http/get_metadata_request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def metadata
asset = xml.xpath("/response/reply/result/asset")
metadata = parse(asset)

# Update to version 0.6.1 of the schema
if metadata[:collection]
metadata[:total_file_count] = asset.xpath("./collection/accumulator/value/non-collections").text
metadata[:size] = asset.xpath("./collection/accumulator/value/total/@h").text
Expand Down Expand Up @@ -60,6 +61,7 @@ def parse_image(image, metadata)
end
end

# Update this to match full 0.6.1 schema
def parse(asset)
{
id: asset.xpath("./@id").text,
Expand Down
1 change: 0 additions & 1 deletion app/services/test_project_generator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ def generate

def create_project
metadata = {
directory: project_prefix,
created_on: Time.current.in_time_zone("America/New_York").iso8601,
created_by: user.uid,
data_sponsor: sponsor.uid,
Expand Down
3 changes: 2 additions & 1 deletion lib/tasks/projects.rake
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ namespace :projects do
desc "Create a test project and a small number of assets in that project"
task :create_small_project, [:uid, :prefix] => [:environment] do |_, args|
uid = args[:uid]
raise "Count must be specified" if uid.blank?
raise "User id must be specified" if uid.blank?
user = User.find_by(uid:)
raise "User #{uid} not found" if user.nil?
project_prefix = args[:prefix]
raise "Project prefix must be specified" if project_prefix.nil?
number = rand(10_000)
Expand Down
56 changes: 10 additions & 46 deletions spec/services/test_project_generator_spec.rb
Original file line number Diff line number Diff line change
@@ -1,57 +1,21 @@
# frozen_string_literal: true
require "rails_helper"

RSpec.describe TestProjectGenerator do
RSpec.describe TestProjectGenerator, connect_to_mediaflux: true do
let(:subject) { described_class.new(user:, number: 1, project_prefix: 'test-project') }
let(:user) { FactoryBot.create :user }
let(:user2) { FactoryBot.create :user }
let(:user3) { FactoryBot.create :user }

before do
# make sure 3 users exist
user2
user3
end

describe "#generate" do

let(:test_collection_create) { instance_double(Mediaflux::Http::AssetCreateRequest, resolve: true, id: "5678") }
let(:test_namespace_describe) { instance_double(Mediaflux::Http::NamespaceDescribeRequest, "exists?": true)}
let(:test_store_list) { instance_double(Mediaflux::Http::StoreListRequest, stores: [{ id: "1", name: "db", tag: "", type: "database" }])}
let(:test_namespace_create) { instance_double(Mediaflux::Http::NamespaceCreateRequest, "error?": false) }
let(:test_accum_count_create) { instance_double(Mediaflux::Http::CreateCollectionAccumulatorRequest, resolve: true) }
let(:test_accum_size_create) { instance_double(Mediaflux::Http::CreateCollectionAccumulatorRequest, resolve: true) }
let(:parent_metadata_request) { instance_double(Mediaflux::Http::GetMetadataRequest, "error?": false) }

before do
allow(user).to receive(:mediaflux_session).and_return("mediaflux_sessionid")
end

it "creates test data" do
allow(Mediaflux::Http::AssetCreateRequest).to receive(:new).with(session_token: "mediaflux_sessionid", name: "test-project-00001", namespace: "/td-test-001/tigerdataNS/test-project-00001NS",
tigerdata_values: {title: "Project 00001", updated_by: nil, updated_on: nil, project_directory: "test-project-00001",
created_by: user.uid, created_on: anything, data_manager: user2.uid, data_sponsor: user2.uid, data_user_read_only: [], data_user_read_write: [],
departments: ["HPC"], description: "Description of project test-project 00001", project_id: "doi-not-generated", project_purpose: "Research", status: "pending",
storage_capacity: {size: {"approved" => nil, "requested" =>500}, unit: {"approved" => nil, "requested" => "GB"}},
storage_performance: {approved: nil, requested: "Standard"}, title: "Project test-project 00001", updated_by: nil, updated_on: nil, updated_by: nil},
xml_namespace: "tigerdata", pid: "path=/td-test-001/tigerdata").and_return(test_collection_create)
allow(Mediaflux::Http::NamespaceDescribeRequest).to receive(:new).with(session_token: "mediaflux_sessionid", path: "/td-test-001/tigerdataNS").and_return(test_namespace_describe)
allow(Mediaflux::Http::StoreListRequest).to receive(:new).with(session_token: "mediaflux_sessionid").and_return(test_store_list)
allow(Mediaflux::Http::NamespaceCreateRequest).to receive(:new).with(session_token: "mediaflux_sessionid", namespace: '/td-test-001/tigerdataNS/test-project-00001NS',description: "Namespace for project Project test-project 00001 (pending)", store:"db").and_return(test_namespace_create)
allow(Mediaflux::Http::CreateCollectionAccumulatorRequest).to receive(:new).with(session_token: "mediaflux_sessionid", name: 'accum-count', collection: "5678", type: "collection.asset.count").and_return(test_accum_count_create)
allow(Mediaflux::Http::CreateCollectionAccumulatorRequest).to receive(:new).with(session_token: "mediaflux_sessionid", name: 'accum-size', collection: "5678", type: "content.all.size").and_return(test_accum_size_create)
allow(Mediaflux::Http::GetMetadataRequest).to receive(:new).with(hash_including(session_token: "mediaflux_sessionid",
id: "path=/td-test-001/tigerdata"
)).and_return(parent_metadata_request)

it "creates a project in mediaflux" do
subject.generate
expect(user).to have_received(:mediaflux_session)
expect(test_collection_create).to have_received(:id)
expect(test_namespace_describe).to have_received(:exists?)
expect(test_namespace_create).to have_received(:error?)
expect(parent_metadata_request).to have_received(:error?)
expect(test_accum_size_create).to have_received(:resolve)
expect(test_accum_count_create).to have_received(:resolve)
project = Project.last
expect(project).to be_persisted
metadata_query = Mediaflux::Http::GetMetadataRequest.new(
session_token: user.mediaflux_session,
id: project.mediaflux_id
)
metadata_query.resolve
expect(metadata_query.metadata[:path]).to eq "/td-test-001/tigerdata/test-project-00001"
end
end
end
6 changes: 6 additions & 0 deletions spec/support/connect_to_mediaflux.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
require "rake"
Rails.application.load_tasks
Rake::Task["schema:create"].invoke
# Clean out the namespace before running tests to avoid collisions
user = FactoryBot.create :user
Mediaflux::Http::NamespaceDestroyRequest.new(
session_token: user.mediaflux_session,
namespace: Rails.configuration.mediaflux[:api_root_ns]
).destroy
end
end

Expand Down

0 comments on commit 6cfe7f8

Please sign in to comment.