Skip to content

Commit

Permalink
fix(config): adopt default values when user-provided value is nil
Browse files Browse the repository at this point in the history
  • Loading branch information
leandrocp committed Feb 10, 2025
1 parent 110ce7a commit 050d4ec
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 34 deletions.
48 changes: 26 additions & 22 deletions lib/beacon/config.ex
Original file line number Diff line number Diff line change
Expand Up @@ -425,15 +425,15 @@ defmodule Beacon.Config do
opts[:router] || raise ConfigError, "missing required option :router"
ensure_repo(opts[:repo])

tailwind_css = Keyword.get(opts, :tailwind_css) || Path.join(Application.app_dir(:beacon, "priv"), "tailwind.css")
tailwind_css = get_opt(opts, :tailwind_css, Path.join(Application.app_dir(:beacon, "priv"), "tailwind.css"))

template_formats =
Keyword.merge(
[
{:heex, "HEEx (HTML)"},
{:markdown, "Markdown (GitHub Flavored version)"}
],
Keyword.get(opts, :template_formats, [])
get_opt(opts, :template_formats, [])
)

lifecycle = [
Expand All @@ -445,32 +445,36 @@ defmodule Beacon.Config do
upload_asset: get_in(opts, [:lifecycle, :upload_asset]) || [thumbnail: &Beacon.Lifecycle.Asset.thumbnail/2]
]

allowed_media_accept_types = Keyword.get(opts, :allowed_media_accept_types, @default_media_types)
allowed_media_accept_types = get_opt(opts, :allowed_media_accept_types, @default_media_types)
validate_allowed_media_accept_types!(allowed_media_accept_types)

assigned_assets = Keyword.get(opts, :assets, [])
assigned_assets = get_opt(opts, :assets, [])
assets = process_assets_config(allowed_media_accept_types, assigned_assets)

default_meta_tags = Keyword.get(opts, :default_meta_tags, [])
extra_asset_fields = Keyword.get(opts, :extra_asset_fields, [{"image/*", [Beacon.MediaLibrary.AssetFields.AltText]}])

page_warming = Keyword.get(opts, :page_warming, {:shortest_paths, 10})

opts =
opts
|> Keyword.put(:tailwind_config, ensure_tailwind_config(opts[:tailwind_config]))
|> Keyword.put(:tailwind_css, tailwind_css)
|> Keyword.put(:template_formats, template_formats)
|> Keyword.put(:lifecycle, lifecycle)
|> Keyword.put(:allowed_media_accept_types, allowed_media_accept_types)
|> Keyword.put(:assets, assets)
|> Keyword.put(:default_meta_tags, default_meta_tags)
|> Keyword.put(:extra_asset_fields, extra_asset_fields)
|> Keyword.put(:page_warming, page_warming)

struct!(__MODULE__, opts)
default_meta_tags = get_opt(opts, :default_meta_tags, [])
extra_asset_fields = get_opt(opts, :extra_asset_fields, [{"image/*", [Beacon.MediaLibrary.AssetFields.AltText]}])

page_warming = get_opt(opts, :page_warming, {:shortest_paths, 10})

struct!(
__MODULE__,
Keyword.merge(opts,
tailwind_config: ensure_tailwind_config(opts[:tailwind_config]),
tailwind_css: tailwind_css,
template_formats: template_formats,
lifecycle: lifecycle,
allowed_media_accept_types: allowed_media_accept_types,
assets: assets,
default_meta_tags: default_meta_tags,
extra_asset_fields: extra_asset_fields,
page_warming: page_warming
)
)
end

# Get `key` from `opts` keyword, otherwise returns `default` even if the key is present but returns `nil`.
defp get_opt(opts, key, default), do: Keyword.get(opts, key) || default

@doc """
Returns the `Beacon.Config` for `site`.
"""
Expand Down
51 changes: 39 additions & 12 deletions test/beacon/config_test.exs
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
defmodule Beacon.ConfigTest do
use ExUnit.Case, async: true

alias Beacon.Config

@site :my_site
@repo Beacon.BeaconTest.Repo

test "returns default when value is nil" do
assert %Beacon.Config{
default_meta_tags: [],
page_warming: {:shortest_paths, 10}
} =
Beacon.Config.new(
site: :site,
endpoint: :endpoint,
router: :router,
repo: @repo,
default_meta_tags: nil,
page_warming: nil
)
end

describe "registry" do
test "returns the site config" do
assert %Beacon.Config{
Expand All @@ -14,19 +27,19 @@ defmodule Beacon.ConfigTest do
safe_code_check: false,
site: :my_site,
tailwind_config: tailwind_config
} = Config.fetch!(@site)
} = Beacon.Config.fetch!(@site)

assert tailwind_config =~ "tailwind.config.templates.js"
end

test "raises for non existing site" do
assert_raise Beacon.ConfigError, ~r/site :invalid not found/, fn ->
Config.fetch!(:invalid)
Beacon.Config.fetch!(:invalid)
end
end

test "updates key from config" do
assert %Config{live_socket_path: "/new_live"} = Config.update_value(:not_booted, :live_socket_path, "/new_live")
assert %Beacon.Config{live_socket_path: "/new_live"} = Beacon.Config.update_value(:not_booted, :live_socket_path, "/new_live")
end
end

Expand All @@ -37,7 +50,7 @@ defmodule Beacon.ConfigTest do
{:heex, "HEEx (HTML)"},
{:markdown, "Markdown (GitHub Flavored version)"}
]
} = Config.new(site: :site, endpoint: :endpoint, router: :router, repo: @repo, template_formats: [])
} = Beacon.Config.new(site: :site, endpoint: :endpoint, router: :router, repo: @repo, template_formats: [])
end

test "merge existing config" do
Expand All @@ -46,7 +59,14 @@ defmodule Beacon.ConfigTest do
{:markdown, "Markdown (GitHub Flavored version)"},
{:heex, "Custom HEEx description"}
]
} = Config.new(site: :site, endpoint: :endpoint, router: :router, repo: @repo, template_formats: [{:heex, "Custom HEEx description"}])
} =
Beacon.Config.new(
site: :site,
endpoint: :endpoint,
router: :router,
repo: @repo,
template_formats: [{:heex, "Custom HEEx description"}]
)
end

test "add config" do
Expand All @@ -56,7 +76,14 @@ defmodule Beacon.ConfigTest do
{:markdown, "Markdown (GitHub Flavored version)"},
{:custom_format, "Custom Format"}
]
} = Config.new(site: :site, endpoint: :endpoint, router: :router, repo: @repo, template_formats: [{:custom_format, "Custom Format"}])
} =
Beacon.Config.new(
site: :site,
endpoint: :endpoint,
router: :router,
repo: @repo,
template_formats: [{:custom_format, "Custom Format"}]
)
end
end

Expand All @@ -71,7 +98,7 @@ defmodule Beacon.ConfigTest do
after_publish_page: [],
upload_asset: [{:thumbnail, _}]
]
} = Config.new(site: :site, endpoint: :endpoint, router: :router, repo: @repo, lifecycle: [load_template: []])
} = Beacon.Config.new(site: :site, endpoint: :endpoint, router: :router, repo: @repo, lifecycle: [load_template: []])
end
end

Expand Down Expand Up @@ -108,20 +135,20 @@ defmodule Beacon.ConfigTest do
{:validations, []},
{:providers, [Beacon.MediaLibrary.Provider.Repo]}
]}
] = Config.new(site: :site, endpoint: :endpoint, router: :router, repo: @repo).assets
] = Beacon.Config.new(site: :site, endpoint: :endpoint, router: :router, repo: @repo).assets
end
end

describe "config_for_media_type/2" do
test "retrieves" do
media_type = "image/jpeg"
config = Config.new(site: :site, endpoint: :endpoint, router: :router, repo: @repo)
config = Beacon.Config.new(site: :site, endpoint: :endpoint, router: :router, repo: @repo)

assert [
{:processor, _},
{:validations, []},
{:providers, [Beacon.MediaLibrary.Provider.Repo]}
] = Config.config_for_media_type(config, media_type)
] = Beacon.Config.config_for_media_type(config, media_type)
end
end
end

0 comments on commit 050d4ec

Please sign in to comment.