require_relative '../test_config' require 'helix_versioning_engine' require 'base64' describe 'HelixVersioningEngine files' do include Rack::Test::Methods def app HELIX_WEB_SERVICES_APP end randstr = (0...8).map { (65 + rand(26)).chr }.join context 'GET /p4/v78/files' do it 'can list depots at the root level' do authorize 'jdoe', ticket_for_jdoe get('/p4/v78/files') expect(last_response.status).to eq(200) results = JSON.parse(last_response.body) if Cloud::Settings.cloud_enabled? expect(results.map{|x| x['name']}).to include('my_project') else expect(results.map{|x| x['name']}).to include('depot') end end it 'can list dirs levels greater than 1' do authorize 'jdoe', ticket_for_jdoe path = Cloud::Settings.cloud_enabled? ? 'my_project' : 'depot' get('/p4/v78/files/' + path) expect(last_response.status).to eq(200) results = JSON.parse(last_response.body) if Cloud::Settings.cloud_enabled? expect(results.map{|x| x['dir']}).to include('//my_project/main') else expect(results.map{|x| x['dir']}).to include('//depot/dev') expect(results.map{|x| x['dir']}).to include('//depot/main') end end it 'can list files at levels greater than 1' do authorize 'jdoe', ticket_for_jdoe path = Cloud::Settings.cloud_enabled? ? 'my_project/main/dev/Experimental' : 'depot/dev/Experimental' get('/p4/v78/files/' + path) expect(last_response.status).to eq(200) results = JSON.parse(last_response.body) if Cloud::Settings.cloud_enabled? expect(results.map{|x| x['depotFile']}).to include('//my_project/main/dev/Experimental/README') else expect(results.map{|x| x['depotFile']}).to include('//depot/dev/Experimental/README') end end end context 'PATCH /p4/v78/files' do it 'can edit and add a new file' do skip 'Not available for cloud (no stream support)' if Cloud::Settings.cloud_enabled? authorize 'jdoe', ticket_for_jdoe patch_data = { 'Description' => "Test #{randstr}", 'Files' => [ { 'DepotFile' => 'README', 'Content' => Base64.encode64("Readme update #{randstr}") }, { 'DepotFile' => "test_#{randstr}", 'Content' => Base64.encode64("New content #{randstr}") } ] } patch('/p4/v78/files/depot/dev/Experimental', patch_data) expect(last_response.status).to eq(200) get('/p4/v78/files/depot/dev/Experimental/README') expect(last_response.status).to eq(200) updated_readme = JSON.parse(last_response.body) expect(Base64.decode64(updated_readme['Content'])).to eq("Readme update #{randstr}") get("/p4/v78/files/depot/dev/Experimental/test_#{randstr}") expect(last_response.status).to eq(200) updated_add = JSON.parse(last_response.body) expect(Base64.decode64(updated_add['Content'])).to eq("New content #{randstr}") end end context 'DELETE /p4/v78/files' do it 'can delete a file' do skip 'Not available for cloud (no stream support)' if Cloud::Settings.cloud_enabled? authorize 'jdoe', ticket_for_jdoe delete("/p4/v78/files/depot/dev/Experimental/test_#{randstr}") expect(last_response.status).to eq(200) get('/p4/v78/files/depot/dev/Experimental') expect(last_response.status).to eq(200) files = JSON.parse(last_response.body) expect(files.map{ |x| x['depotFile']}).to_not include("//depot/dev/Experimental/test_#{randstr}") end end end