Compare commits

...
6 Commits
Author SHA1 Message Date
KKlochko e89a8ea5db Update Links.create_one to use a function.
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build was killed
2023-08-04 21:10:36 +03:00
KKlochko feebbe4f8a Add a generator for Link with random shorten. 2023-08-04 21:10:08 +03:00
KKlochko ecdce9e407 Add the test config.
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build was killed
2023-08-03 14:36:07 +03:00
KKlochko e3b202825b Add the CI/CD configuration. 2023-08-03 14:35:14 +03:00
KKlochko ebac60a2b0 Add tests for the Links module. 2023-08-02 21:26:56 +03:00
KKlochko c6236c0ef1 Refactor the Links module. 2023-08-02 21:20:01 +03:00
9 changed files with 243 additions and 32 deletions
+52
View File
@@ -0,0 +1,52 @@
kind: pipeline
type: docker
name: default
environment:
DATABASE_NAME: link_shortener_dev
DATABASE_USERNAME: postgres
DATABASE_PASSWORD: postgres
DATABASE_HOST: postgres
DATABASE_PORT: 5432
SECRET_KEY_BASE: TestSecretKeycRZ1H45gfdAsdf8DIb45df4664mRCruzwVEF68wosddfg324ost
steps:
- name: install dependencies
image: elixir:1.14.0-slim
volumes:
- name: mix
path: /root/.mix
commands:
- mix local.hex --force
- mix local.rebar --force
- mix deps.get
- mix compile
- name: run migrations
image: elixir:1.14.0-slim
volumes:
- name: mix
path: /root/.mix
commands:
- mix ecto.setup
- name: run tests
image: elixir:1.14.0-slim
volumes:
- name: mix
path: /root/.mix
commands:
- mix test
volumes:
- name: mix
temp: {}
services:
- name: postgres
image: postgres:15-alpine
environment:
POSTGRES_DB: link_shortener_dev
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
+10
View File
@@ -36,4 +36,14 @@
Add the API to update the Link model. Add the API to update the Link model.
** 0.4.7 <2023-08-01 Tue> ** 0.4.7 <2023-08-01 Tue>
Add tests for the API. Add tests for the API.
** 0.4.8 <2023-08-02 Wed>
Refactor the Links module.
** 0.4.9 <2023-08-02 Wed>
Add tests for the Links module.
** 0.4.10 <2023-08-03 Thu>
Add the CI/CD configuration.
Add the test config.
** 0.5.1 <2023-08-04 Fri>
Add a generator for Link with random shorten.
Update Links.create_one to use a function.
+30
View File
@@ -0,0 +1,30 @@
import Config
# Configure your database
#
# The MIX_TEST_PARTITION environment variable can be used
# to provide built-in test partitioning in CI environment.
# Run `mix help test` for more information.
config :link_shortener, LinkShortener.Repo,
username: System.get_env("DATABASE_USERNAME"),
password: System.get_env("DATABASE_PASSWORD"),
hostname: System.get_env("DATABASE_HOST"),
database: "link_shortener_test#{System.get_env("MIX_TEST_PARTITION")}",
pool: Ecto.Adapters.SQL.Sandbox,
pool_size: 10
# We don't run a server during test. If one is required,
# you can enable the server option below.
config :link_shortener, LinkShortenerWeb.Endpoint,
http: [ip: {127, 0, 0, 1}, port: 4002],
secret_key_base: System.get_env("SECRET_KEY_BASE"),
server: false
# In test we don't send emails.
config :link_shortener, LinkShortener.Mailer, adapter: Swoosh.Adapters.Test
# Print only warnings and errors during test
config :logger, level: :warn
# Initialize plugs at runtime for faster test compilation
config :phoenix, :plug_init_mode, :runtime
@@ -0,0 +1,14 @@
defmodule LinkShortener.Generators.LinkWithRandomShorten do
@moduledoc """
This module provides a generator for Link.
"""
alias LinkShortener.Generators.SafeString
@doc """
Generate a Link with random shorten with the length.
"""
def generate_one(attrs, length \\ 10, generator \\ &SafeString.generate/1) do
Map.put(attrs, :shorten, generator.(length))
end
end
+24 -25
View File
@@ -1,16 +1,16 @@
defmodule LinkShortener.Links.Links do defmodule LinkShortener.Links do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
import Ecto.Query import Ecto.Query
alias LinkShortener.Repo alias LinkShortener.Repo
alias LinkShortener.Links.Link alias LinkShortener.Links.Link
alias LinkShortener.Generators.SafeString alias LinkShortener.Generators.LinkWithRandomShorten, as: LinkGenerator
def new_one(), do: Link.changeset(%Link{}) def new_one(), do: Link.changeset(%Link{}, %{})
def create_one(attrs, length \\ 10, generator \\ SafeString) do def create_one(attrs, length \\ 10, generator \\ &LinkGenerator.generate_one/2) do
shorten = generator.generate(length) generator.(attrs, length)
insert_one(Map.put(attrs, :shorten, shorten)) |> insert_one()
end end
def insert_one(attrs) do def insert_one(attrs) do
@@ -19,25 +19,10 @@ defmodule LinkShortener.Links.Links do
|> Repo.insert() |> Repo.insert()
end end
def edit_one(id) do def get_one!(id) do
get_one(id) Repo.get!(Link, id)
|> Link.changeset()
end end
def update_one(%Link{} = link, changes) do
link
|> Link.changeset(changes)
|> Repo.update()
end
def insert_one(attrs) do
%Link{}
|> Link.changeset(attrs)
|> Repo.insert()
end
def delete_one(%Link{} = link), do: Repo.delete(link)
def get_one_by(attrs) do def get_one_by(attrs) do
Repo.get_by(Link, attrs) Repo.get_by(Link, attrs)
end end
@@ -46,12 +31,26 @@ defmodule LinkShortener.Links.Links do
get_one_by(%{shorten: shorten}) get_one_by(%{shorten: shorten})
end end
def get_one(id) do def get_all() do
Repo.get!(Link, id) from(Link)
|> Repo.all()
end end
def get_all(opts) do def get_all(opts) do
from(Link) from(Link)
|> Repo.all() |> Repo.all()
end end
def edit_one(%Link{} = link) do
link
|> Link.changeset(%{})
end
def update_one(%Link{} = link, changes) do
link
|> Link.changeset(changes)
|> Repo.update()
end
def delete_one(%Link{} = link), do: Repo.delete(link)
end end
@@ -1,13 +1,13 @@
defmodule LinkShortenerWeb.Api.V1.LinkController do defmodule LinkShortenerWeb.Api.V1.LinkController do
use LinkShortenerWeb, :controller use LinkShortenerWeb, :controller
alias LinkShortener.Links.Links alias LinkShortener.Links
alias LinkShortener.Links.Link alias LinkShortener.Links.Link
action_fallback LinkShortenerWeb.FallbackController action_fallback LinkShortenerWeb.FallbackController
def index(conn, _params) do def index(conn, _params) do
links = Links.get_all({}) links = Links.get_all()
render(conn, "index.json", links: links) render(conn, "index.json", links: links)
end end
@@ -21,12 +21,12 @@ defmodule LinkShortenerWeb.Api.V1.LinkController do
end end
def show(conn, %{"id" => id}) do def show(conn, %{"id" => id}) do
link = Links.get_one(id) link = Links.get_one!(id)
render(conn, "show.json", link: link) render(conn, "show.json", link: link)
end end
def update(conn, %{"id" => id, "link" => link_params}) do def update(conn, %{"id" => id, "link" => link_params}) do
link = Links.get_one(id) link = Links.get_one!(id)
with {:ok, %Link{} = link} <- Links.update_one(link, link_params) do with {:ok, %Link{} = link} <- Links.update_one(link, link_params) do
render(conn, "show.json", link: link) render(conn, "show.json", link: link)
@@ -34,7 +34,7 @@ defmodule LinkShortenerWeb.Api.V1.LinkController do
end end
def delete(conn, %{"id" => id}) do def delete(conn, %{"id" => id}) do
link = Links.get_one(id) link = Links.get_one!(id)
with {:ok, %Link{}} <- Links.delete_one(link) do with {:ok, %Link{}} <- Links.delete_one(link) do
send_resp(conn, :no_content, "") send_resp(conn, :no_content, "")
+106
View File
@@ -0,0 +1,106 @@
defmodule LinkShortener.LinksTest do
use LinkShortener.DataCase
alias LinkShortener.Links
@create_attrs %{
name: "some link name",
url: "https://gitlab.com/KKlochko/link_shortener",
shorten: "git_repo",
}
@create_generated_attrs %{
name: "some link name",
url: "https://gitlab.com/KKlochko/link_shortener",
}
@update_attrs %{
name: "some updated link name",
url: "https://gitlab.com/KKlochko/link_shortener2",
shorten: "new_git_repo",
}
@invalid_attrs %{
name: nil,
url: nil,
shorten: nil,
}
describe "links" do
alias LinkShortener.Links.Link
import LinkShortener.LinksFixtures
test "new_one/1 returns the changeset" do
assert %Ecto.Changeset{} = Links.new_one()
end
test "create_one/1 with valid data creates a link" do
assert {:ok, %Link{} = link} = Links.create_one(@create_generated_attrs)
assert link.name == "some link name"
assert link.url == "https://gitlab.com/KKlochko/link_shortener"
assert String.length(link.shorten) == 10
end
test "create_one/2 with valid data creates a link" do
assert {:ok, %Link{} = link} = Links.create_one(@create_generated_attrs, 5)
assert link.name == "some link name"
assert link.url == "https://gitlab.com/KKlochko/link_shortener"
assert String.length(link.shorten) == 5
end
test "insert_one/1 with valid data creates a link" do
assert {:ok, %Link{} = link} = Links.insert_one(@create_attrs)
assert link.name == "some link name"
assert link.url == "https://gitlab.com/KKlochko/link_shortener"
assert link.shorten == "git_repo"
end
test "insert_one/1 with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{}} = Links.insert_one(@invalid_attrs)
end
test "get_one!/1 returns the link with given id" do
link = link_fixture()
assert Links.get_one!(link.id) == link
end
test "get_one_by!/1 returns the link with given shorten" do
link = link_fixture()
assert Links.get_one_by(%{shorten: link.shorten}) == link
end
test "get_one_by_shorten!/1 returns the link with given shorten" do
link = link_fixture()
assert Links.get_one_by_shorten(link.shorten) == link
end
test "get_all/0 returns all links" do
link = link_fixture()
assert Links.get_all() == [link]
end
test "edit_one/1 with valid data returns the changeset" do
link = link_fixture()
assert %Ecto.Changeset{} = Links.edit_one(link)
end
test "update_one/2 with valid data updates the link" do
link = link_fixture()
assert {:ok, %Link{} = link} = Links.update_one(link, @update_attrs)
assert link.name == "some updated link name"
assert link.url == "https://gitlab.com/KKlochko/link_shortener2"
assert link.shorten == "new_git_repo"
end
test "update_link/2 with invalid data returns error changeset" do
link = link_fixture()
assert {:error, %Ecto.Changeset{}} = Links.update_one(link, @invalid_attrs)
assert link == Links.get_one!(link.id)
end
test "delete_one/1 deletes the link" do
link = link_fixture()
assert {:ok, %Link{}} = Links.delete_one(link)
assert_raise Ecto.NoResultsError, fn -> Links.get_one!(link.id) end
end
end
end
@@ -4,7 +4,7 @@ defmodule LinkShortenerWeb.Api.V1.LinkControllerTest do
import LinkShortener.LinksFixtures import LinkShortener.LinksFixtures
alias LinkShortener.Links.Link alias LinkShortener.Links.Link
alias LinkShortener.Links.Links alias LinkShortener.Links
@create_attrs %{ @create_attrs %{
name: "some link name", name: "some link name",
+1 -1
View File
@@ -4,7 +4,7 @@ defmodule LinkShortener.LinksFixtures do
entities via the `LinkShortener.Links` context. entities via the `LinkShortener.Links` context.
""" """
alias LinkShortener.Links.Links alias LinkShortener.Links
@doc """ @doc """
Generate a link. Generate a link.