diff --git a/spec/services/photoprism/cache_preview_token_spec.rb b/spec/services/photoprism/cache_preview_token_spec.rb new file mode 100644 index 00000000..298aee98 --- /dev/null +++ b/spec/services/photoprism/cache_preview_token_spec.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Photoprism::CachePreviewToken, type: :service do + let(:user) { double('User', id: 1) } + let(:preview_token) { 'sample_token' } + let(:service) { described_class.new(user, preview_token) } + + describe '#call' do + it 'writes the preview token to the cache with the correct key' do + expect(Rails.cache).to receive(:write).with( + "dawarich/photoprism_preview_token_#{user.id}", preview_token + ) + + service.call + end + end +end diff --git a/spec/services/photoprism/import_geodata_spec.rb b/spec/services/photoprism/import_geodata_spec.rb new file mode 100644 index 00000000..341348fc --- /dev/null +++ b/spec/services/photoprism/import_geodata_spec.rb @@ -0,0 +1,177 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Photoprism::ImportGeodata do + describe '#call' do + subject(:service) { described_class.new(user).call } + + let(:user) do + create(:user, settings: { 'photoprism_url' => 'http://photoprism.app', 'photoprism_api_key' => '123456' }) + end + let(:photoprism_data) do + [ + { + 'ID' => '82', + 'UID' => 'psnveqq089xhy1c3', + 'Type' => 'image', + 'TypeSrc' => '', + 'TakenAt' => '2024-08-18T14:11:05Z', + 'TakenAtLocal' => '2024-08-18T16:11:05Z', + 'TakenSrc' => 'meta', + 'TimeZone' => 'Europe/Prague', + 'Path' => '2024/08', + 'Name' => '20240818_141105_44E61AED', + 'OriginalName' => 'PXL_20240818_141105789', + 'Title' => 'Moment / Karlovy Vary / 2024', + 'Description' => '', + 'Year' => 2024, + 'Month' => 8, + 'Day' => 18, + 'Country' => 'cz', + 'Stack' => 0, + 'Favorite' => false, + 'Private' => false, + 'Iso' => 37, + 'FocalLength' => 21, + 'FNumber' => 2.2, + 'Exposure' => '1/347', + 'Quality' => 4, + 'Resolution' => 10, + 'Color' => 2, + 'Scan' => false, + 'Panorama' => false, + 'CameraID' => 8, + 'CameraSrc' => 'meta', + 'CameraMake' => 'Google', + 'CameraModel' => 'Pixel 7 Pro', + 'LensID' => 11, + 'LensMake' => 'Google', + 'LensModel' => 'Pixel 7 Pro front camera 2.74mm f/2.2', + 'Altitude' => 423, + 'Lat' => 50.11, + 'Lng' => 12.12, + 'CellID' => 's2:47a09944f33c', + 'PlaceID' => 'cz:ciNqTjWuq6NN', + 'PlaceSrc' => 'meta', + 'PlaceLabel' => 'Karlovy Vary, Severozápad, Czech Republic', + 'PlaceCity' => 'Karlovy Vary', + 'PlaceState' => 'Severozápad', + 'PlaceCountry' => 'cz', + 'InstanceID' => '', + 'FileUID' => 'fsnveqqeusn692qo', + 'FileRoot' => '/', + 'FileName' => '2024/08/20240818_141105_44E61AED.jpg', + 'Hash' => 'cc5d0f544e52b288d7c8460d2e1bb17fa66e6089', + 'Width' => 2736, + 'Height' => 3648, + 'Portrait' => true, + 'Merged' => false, + 'CreatedAt' => '2024-12-02T14:25:38Z', + 'UpdatedAt' => '2024-12-02T14:25:38Z', + 'EditedAt' => '0001-01-01T00:00:00Z', + 'CheckedAt' => '2024-12-02T14:36:45Z', + 'Files' => nil + }, + { + 'ID' => '81', + 'UID' => 'psnveqpl96gcfdzf', + 'Type' => 'image', + 'TypeSrc' => '', + 'TakenAt' => '2024-08-18T14:11:04Z', + 'TakenAtLocal' => '2024-08-18T16:11:04Z', + 'TakenSrc' => 'meta', + 'TimeZone' => 'Europe/Prague', + 'Path' => '2024/08', + 'Name' => '20240818_141104_E9949CD4', + 'OriginalName' => 'PXL_20240818_141104633', + 'Title' => 'Portrait / Karlovy Vary / 2024', + 'Description' => '', + 'Year' => 2024, + 'Month' => 8, + 'Day' => 18, + 'Country' => 'cz', + 'Stack' => 0, + 'Favorite' => false, + 'Private' => false, + 'Iso' => 43, + 'FocalLength' => 21, + 'FNumber' => 2.2, + 'Exposure' => '1/356', + 'Faces' => 1, + 'Quality' => 4, + 'Resolution' => 10, + 'Color' => 2, + 'Scan' => false, + 'Panorama' => false, + 'CameraID' => 8, + 'CameraSrc' => 'meta', + 'CameraMake' => 'Google', + 'CameraModel' => 'Pixel 7 Pro', + 'LensID' => 11, + 'LensMake' => 'Google', + 'LensModel' => 'Pixel 7 Pro front camera 2.74mm f/2.2', + 'Altitude' => 423, + 'Lat' => 50.21, + 'Lng' => 12.85, + 'CellID' => 's2:47a09944f33c', + 'PlaceID' => 'cz:ciNqTjWuq6NN', + 'PlaceSrc' => 'meta', + 'PlaceLabel' => 'Karlovy Vary, Severozápad, Czech Republic', + 'PlaceCity' => 'Karlovy Vary', + 'PlaceState' => 'Severozápad', + 'PlaceCountry' => 'cz', + 'InstanceID' => '', + 'FileUID' => 'fsnveqp9xsl7onsv', + 'FileRoot' => '/', + 'FileName' => '2024/08/20240818_141104_E9949CD4.jpg', + 'Hash' => 'd5dfadc56a0b63051dfe0b5dec55ff1d81f033b7', + 'Width' => 2736, + 'Height' => 3648, + 'Portrait' => true, + 'Merged' => false, + 'CreatedAt' => '2024-12-02T14:25:37Z', + 'UpdatedAt' => '2024-12-02T14:25:37Z', + 'EditedAt' => '0001-01-01T00:00:00Z', + 'CheckedAt' => '2024-12-02T14:36:45Z', + 'Files' => nil + } + ].to_json + end + + before do + stub_request(:get, %r{http://photoprism\.app/api/v1/photos}).with( + headers: { + 'Accept' => 'application/json', + 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', + 'Authorization' => 'Bearer 123456', + 'User-Agent' => 'Ruby' + } + ).to_return(status: 200, body: photoprism_data, headers: {}) + end + + it 'creates import' do + expect { service }.to change { Import.count }.by(1) + end + + it 'enqueues ImportJob' do + expect(ImportJob).to receive(:perform_later) + + service + end + + context 'when import already exists' do + before { service } + + it 'does not create new import' do + expect { service }.not_to(change { Import.count }) + end + + it 'does not enqueue ImportJob' do + expect(ImportJob).to_not receive(:perform_later) + + service + end + end + end +end