Skip to content

Commit bded9e8

Browse files
committed
image: add tests
1 parent 8a5c127 commit bded9e8

File tree

2 files changed

+65
-11
lines changed

2 files changed

+65
-11
lines changed

lib/data/image.ex

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,18 @@ defmodule Memorable.Data.Image.DerivedMetadata do
5959
with {:read_file, {:ok, data}} <- {:read_file, File.read(path)},
6060
{:read_metadata, {:ok, metadata}} <-
6161
{:read_metadata, Image.read_metadata(image)} do
62-
%__MODULE__{
63-
image_id: image_id,
64-
file_hash: :crypto.hash(:sha256, data),
65-
original_datetime: original_datetime(metadata),
66-
lens_model: Map.get(metadata, "LensID"),
67-
body_model: Map.get(metadata, "Model"),
68-
focal_length: focal_length(metadata),
69-
aperture: Map.get(metadata, "Aperture"),
70-
exposure_time: Map.get(metadata, "ExposureTime"),
71-
iso: Map.get(metadata, "ISO")
72-
}
62+
{:ok,
63+
%__MODULE__{
64+
image_id: image_id,
65+
file_hash: :crypto.hash(:sha256, data),
66+
original_datetime: original_datetime(metadata),
67+
lens_model: Map.get(metadata, "LensID"),
68+
body_model: Map.get(metadata, "Model"),
69+
focal_length: focal_length(metadata),
70+
aperture: Map.get(metadata, "Aperture"),
71+
exposure_time: Map.get(metadata, "ExposureTime"),
72+
iso: Map.get(metadata, "ISO")
73+
}}
7374
else
7475
{:read_file, error} -> {:error, {:read_file, error}}
7576
{:read_metadata, error} -> {:error, {:read_metadata, error}}

test/data/image_test.exs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
defmodule Memorable.Data.ImageTest do
2+
use ExUnit.Case
3+
alias Memorable.Data.Image
4+
alias Memorable.Data.Image.DerivedMetadata
5+
doctest Memorable.Data.Image
6+
7+
setup_all do
8+
on_exit(fn ->
9+
Memento.Table.clear(Image)
10+
end)
11+
12+
# `Command` in rust needs to call waitpid(2), which fails with ECHILD when the signal handler
13+
# for SIGCHLD is set to SIG_IGN, as is done in the erlang vm.
14+
# <https://github.com/rusterlium/rustler/issues/446>
15+
# <http://erlang.org/pipermail/erlang-questions/2020-November/100109.html>
16+
:os.set_signal(:sigchld, :default)
17+
18+
[
19+
image: %Image{
20+
id: 1,
21+
collection_id: nil,
22+
path: "test/data/20250317_0_0028_01.jpg",
23+
imported_datetime: DateTime.utc_now()
24+
}
25+
]
26+
end
27+
28+
describe "Image.read_metadata/1" do
29+
test "dumps exif data for the given image", %{image: image} do
30+
{:ok, metadata} = Image.read_metadata(image)
31+
assert Map.get(metadata, "DateTimeOriginal") == "2025-03-17T18:38:23"
32+
assert Map.get(metadata, "Model") == "Canon EOS 1000D"
33+
assert Map.get(metadata, "LensID") == "Canon EF-S 55-250mm f/4-5.6 IS STM"
34+
assert Map.get(metadata, "FocalLength") == "250.0 mm"
35+
assert Map.get(metadata, "Aperture") == 5.6
36+
assert Map.get(metadata, "ExposureTime") == "1/1250"
37+
assert Map.get(metadata, "ISO") == 100
38+
end
39+
end
40+
41+
describe "DerivedMetadata.from_image/1" do
42+
test "parses exif data for the given image", %{image: image} do
43+
{:ok, metadata} = DerivedMetadata.from_image(image) |> IO.inspect()
44+
assert Map.get(metadata, :original_datetime) == ~N[2025-03-17 18:38:23]
45+
assert Map.get(metadata, :body_model) == "Canon EOS 1000D"
46+
assert Map.get(metadata, :lens_model) == "Canon EF-S 55-250mm f/4-5.6 IS STM"
47+
assert Map.get(metadata, :focal_length) == 250.0
48+
assert Map.get(metadata, :aperture) == 5.6
49+
assert Map.get(metadata, :exposure_time) == "1/1250"
50+
assert Map.get(metadata, :iso) == 100
51+
end
52+
end
53+
end

0 commit comments

Comments
 (0)