Current section
Files
Jump to
Current section
Files
src/adapter_test_helpers/sumo_basic_test_helper.erl
-module(sumo_basic_test_helper).
%% Test Cases - Helpers
-export([
create_schema/1,
find/1,
find_all/1,
find_by/1,
delete_all/1,
delete/1,
check_proper_dates/1,
init_store/1
]).
-type config() :: [{atom(), term()}].
%%%=============================================================================
%%% Test Cases - Helpers
%%%=============================================================================
-spec create_schema(config()) -> ok.
create_schema(Config) ->
ok = sumo:create_schema(),
Tables = mnesia:system_info(tables),
{_, Name} = lists:keyfind(name, 1, Config),
true = lists:member(Name, Tables),
ok.
-spec find(config()) -> ok.
find(Config) ->
{_, Name} = lists:keyfind(name, 1, Config),
Module = sumo_config:get_prop_value(Name, module),
[First, Second | _] = sumo:find_all(Name),
First = sumo:find_one(Name, [{id, Module:id(First)}]),
Second = sumo:fetch(Name, Module:id(Second)),
notfound = sumo:fetch(Name, 0),
notfound = sumo:find_one(Name, [{id, 0}]),
ok.
-spec find_all(config()) -> ok.
find_all(Config) ->
{_, Name} = lists:keyfind(name, 1, Config),
[_, _, _, _, _, _, _, _] = sumo:find_all(Name),
ok.
-spec find_by(config()) -> ok.
find_by(Config) ->
{_, Name} = lists:keyfind(name, 1, Config),
Module = sumo_config:get_prop_value(Name, module),
Results = sumo:find_by(Name, [{last_name, <<"D">>}]),
[_, _] = Results,
SortFun = fun(A, B) -> Module:name(A) < Module:name(B) end,
[First, Second | _] = lists:sort(SortFun, Results),
{Today, _} = calendar:universal_time(),
<<"B">> = Module:name(First),
<<"D">> = Module:name(Second),
3 = Module:age(First),
4 = Module:age(Second),
<<"D">> = Module:last_name(First),
undefined = Module:address(First),
Today = Module:birthdate(First),
undefined = Module:height(First),
undefined = Module:description(First),
{Today, _} = Module:created_at(First),
false = Module:is_blocked(First),
true = Module:weird_field1(First),
undefined = Module:weird_field2(First),
undefined = Module:weird_field3(First),
% Check that it returns what we have inserted
[LastPerson | _NothingElse] = sumo:find_by(Name, [
{last_name, <<"LastName">>}
]),
<<"Name">> = Module:name(LastPerson),
<<"LastName">> = Module:last_name(LastPerson),
3 = Module:age(LastPerson),
undefined = Module:address(LastPerson),
{Date, _} = calendar:universal_time(),
Date = Module:birthdate(LastPerson),
1.75 = Module:height(LastPerson),
<<"description">> = Module:description(LastPerson),
<<"profile_image">> = Module:profile_image(LastPerson),
true = Module:is_blocked(LastPerson),
{mytuple, false, 1, "2", <<"3">>} = Module:weird_field1(LastPerson),
[1, true, <<"hi">>, 1.1] = Module:weird_field2(LastPerson),
#{a := 1,
b := [1, "2", <<"3">>],
<<"c">> := false
} = Module:weird_field3(LastPerson),
{Today, _} = Module:created_at(LastPerson),
%% Check find_by ID
FirstId = Module:id(First),
[First1] = sumo:find_by(Name, [{id, FirstId}]),
[First1] = sumo:find_by(Name, [{last_name, <<"D">>}, {id, FirstId}]),
[] = sumo:find_by(Name, [{name, <<"NotB">>}, {id, FirstId}]),
First1 = First,
%% Check pagination
Results1 = sumo:find_by(Name, [], 3, 1),
[_, _, _] = Results1,
%% This test is #177 github issue related
[_, _, _, _, _, _, _, _] = sumo:find_by(Name, []),
Robot = sumo:find_by(Name, [{name, <<"Model T-2000">>}]),
[_] = Robot,
ok.
-spec delete_all(config()) -> ok.
delete_all(Config) ->
{_, Name} = lists:keyfind(name, 1, Config),
sumo:delete_all(Name),
[] = sumo:find_all(Name),
ok.
-spec delete(config()) -> ok.
delete(Config) ->
{_, Name} = lists:keyfind(name, 1, Config),
Module = sumo_config:get_prop_value(Name, module),
%% delete_by
2 = sumo:delete_by(Name, [{last_name, <<"D">>}]),
Results = sumo:find_by(Name, [{last_name, <<"D">>}]),
[] = Results,
%% delete
[First | _ ] = All = sumo:find_all(Name),
Id = Module:id(First),
sumo:delete(Name, Id),
NewAll = sumo:find_all(Name),
[_] = All -- NewAll,
ok.
-spec check_proper_dates(config()) -> ok.
check_proper_dates(Config) ->
{_, Name} = lists:keyfind(name, 1, Config),
Module = sumo_config:get_prop_value(Name, module),
[P0] = sumo:find_by(Name, [{name, <<"A">>}]),
P1 = sumo:fetch(Name, Module:id(P0)),
[P2 | _] = sumo:find_all(Name),
{Date, _} = calendar:universal_time(),
Date = Module:birthdate(P0),
{Date, {_, _, _}} = Module:created_at(P0),
Date = Module:birthdate(P1),
{Date, {_, _, _}} = Module:created_at(P1),
Date = Module:birthdate(P2),
{Date, {_, _, _}} = Module:created_at(P2),
Person = sumo:persist(Name, Module:new(<<"X">>, <<"Z">>, 6)),
Date = Module:birthdate(Person),
ok.
-spec init_store(atom()) -> ok.
init_store(Name) ->
sumo:create_schema(Name),
Module = sumo_config:get_prop_value(Name, module),
sumo:delete_all(Name),
DT = {Date, _} = calendar:universal_time(),
sumo:persist(Name, Module:new(<<"A">>, <<"E">>, 6)),
sumo:persist(Name, Module:from_map(#{
name => <<"B">>,
last_name => <<"D">>,
age => 3,
birthdate => Date,
created_at => DT,
weird_field1 => true
})),
sumo:persist(Name, Module:new(<<"C">>, <<"C">>, 5)),
sumo:persist(Name, Module:new(<<"D">>, <<"D">>, 4)),
sumo:persist(Name, Module:new(<<"E">>, <<"A">>, 2)),
sumo:persist(Name, Module:new(<<"F">>, <<"E">>, 1)),
sumo:persist(Name, Module:new(<<"Model T-2000">>, <<"undefined">>, 7)),
sumo:persist(Name, Module:from_map(#{
name => <<"Name">>,
last_name => <<"LastName">>,
age => 3,
birthdate => Date,
created_at => DT,
height => 1.75,
description => <<"description">>,
profile_image => <<"profile_image">>,
is_blocked => true,
weird_field1 => {mytuple, false, 1, "2", <<"3">>},
weird_field2 => [1, true, <<"hi">>, 1.1],
weird_field3 => #{a => 1, b => [1, "2", <<"3">>], <<"c">> => false}
})),
ok.