Skip to content

Commit 99a6c45

Browse files
authored
TD-943: Fixes invoice template state reconstruction and adds tests (#139)
* TD-943: Fixes invoice template state reconstruction and adds tests * Fixes typo
1 parent 1c99fe0 commit 99a6c45

File tree

4 files changed

+152
-16
lines changed

4 files changed

+152
-16
lines changed

apps/hellgate/src/hg_invoice_template.erl

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ validate_price({unlim, _}, _Shop) ->
146146
ok.
147147

148148
start(ID, Params) ->
149-
EncodedParams = marchal_invoice_template_params(Params),
149+
EncodedParams = marshal_invoice_template_params(Params),
150150
map_start_error(hg_machine:start(?NS, ID, EncodedParams)).
151151

152152
call(ID, Function, Args) ->
@@ -208,7 +208,7 @@ namespace() ->
208208

209209
-spec init(binary(), hg_machine:machine()) -> hg_machine:result().
210210
init(EncodedParams, #{id := ID}) ->
211-
Params = unmarchal_invoice_template_params(EncodedParams),
211+
Params = unmarshal_invoice_template_params(EncodedParams),
212212
Tpl = create_invoice_template(ID, Params),
213213
#{events => [marshal_event_payload([?tpl_created(Tpl)])]}.
214214

@@ -223,7 +223,8 @@ create_invoice_template(ID, P) ->
223223
description = P#payproc_InvoiceTemplateCreateParams.description,
224224
created_at = hg_datetime:format_now(),
225225
details = P#payproc_InvoiceTemplateCreateParams.details,
226-
context = P#payproc_InvoiceTemplateCreateParams.context
226+
context = P#payproc_InvoiceTemplateCreateParams.context,
227+
mutations = P#payproc_InvoiceTemplateCreateParams.mutations
227228
}.
228229

229230
-spec process_repair(hg_machine:args(), hg_machine:machine()) -> no_return().
@@ -272,7 +273,8 @@ merge_changes(
272273
product = Product,
273274
description = Description,
274275
details = Details,
275-
context = Context
276+
context = Context,
277+
mutations = Mutations
276278
})
277279
],
278280
Tpl
@@ -283,7 +285,8 @@ merge_changes(
283285
{product, Product},
284286
{description, Description},
285287
{details, Details},
286-
{context, Context}
288+
{context, Context},
289+
{mutations, Mutations}
287290
],
288291
lists:foldl(fun update_field/2, Tpl, Diff).
289292

@@ -300,12 +303,14 @@ update_field({description, V}, Tpl) ->
300303
update_field({details, V}, Tpl) ->
301304
Tpl#domain_InvoiceTemplate{details = V};
302305
update_field({context, V}, Tpl) ->
303-
Tpl#domain_InvoiceTemplate{context = V}.
306+
Tpl#domain_InvoiceTemplate{context = V};
307+
update_field({mutations, V}, Tpl) ->
308+
Tpl#domain_InvoiceTemplate{mutations = V}.
304309

305310
%% Marshaling
306311

307-
-spec marchal_invoice_template_params(create_params()) -> binary().
308-
marchal_invoice_template_params(Params) ->
312+
-spec marshal_invoice_template_params(create_params()) -> binary().
313+
marshal_invoice_template_params(Params) ->
309314
Type = {struct, struct, {dmsl_payproc_thrift, 'InvoiceTemplateCreateParams'}},
310315
hg_proto_utils:serialize(Type, Params).
311316

@@ -323,8 +328,8 @@ wrap_event_payload(Payload) ->
323328

324329
%% Unmashaling
325330

326-
-spec unmarchal_invoice_template_params(binary()) -> create_params().
327-
unmarchal_invoice_template_params(EncodedParams) ->
331+
-spec unmarshal_invoice_template_params(binary()) -> create_params().
332+
unmarshal_invoice_template_params(EncodedParams) ->
328333
Type = {struct, struct, {dmsl_payproc_thrift, 'InvoiceTemplateCreateParams'}},
329334
hg_proto_utils:deserialize(Type, EncodedParams).
330335

apps/hellgate/test/hg_ct_helper.erl

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
-export([make_invoice_tpl_create_params/5]).
3030
-export([make_invoice_tpl_create_params/6]).
3131
-export([make_invoice_tpl_create_params/7]).
32+
-export([make_invoice_tpl_create_params/8]).
3233
-export([make_invoice_tpl_details/2]).
3334

3435
-export([make_invoice_tpl_update_params/1]).
@@ -361,6 +362,7 @@ create_client_w_context(RootUrl, WoodyCtx) ->
361362
-type invoice_params_tpl() :: dmsl_payproc_thrift:'InvoiceWithTemplateParams'().
362363
-type timestamp() :: integer().
363364
-type context() :: dmsl_base_thrift:'Content'().
365+
-type mutation() :: dmsl_domain_thrift:'InvoiceMutationParams'().
364366
-type lifetime_interval() :: dmsl_domain_thrift:'LifetimeInterval'().
365367
-type invoice_details() :: dmsl_domain_thrift:'InvoiceDetails'().
366368
-type invoice_tpl_details() :: dmsl_domain_thrift:'InvoiceTemplateDetails'().
@@ -654,14 +656,28 @@ make_invoice_tpl_create_params(PartyID, ShopID, Lifetime, Product, Details, Cont
654656
context()
655657
) -> invoice_tpl_create_params().
656658
make_invoice_tpl_create_params(InvoiceTemplateID, PartyID, ShopID, Lifetime, Product, Details, Context) ->
659+
make_invoice_tpl_create_params(InvoiceTemplateID, PartyID, ShopID, Lifetime, Product, Details, Context, undefined).
660+
661+
-spec make_invoice_tpl_create_params(
662+
invoice_template_id(),
663+
party_id(),
664+
shop_id(),
665+
lifetime_interval(),
666+
binary(),
667+
invoice_tpl_details(),
668+
context(),
669+
[mutation()] | undefined
670+
) -> invoice_tpl_create_params().
671+
make_invoice_tpl_create_params(InvoiceTemplateID, PartyID, ShopID, Lifetime, Product, Details, Context, Mutations) ->
657672
#payproc_InvoiceTemplateCreateParams{
658673
template_id = InvoiceTemplateID,
659674
party_id = PartyID,
660675
shop_id = ShopID,
661676
invoice_lifetime = Lifetime,
662677
product = Product,
663678
details = Details,
664-
context = Context
679+
context = Context,
680+
mutations = Mutations
665681
}.
666682

667683
-spec make_invoice_tpl_details(binary(), invoice_tpl_cost()) -> invoice_tpl_details().
@@ -685,7 +701,9 @@ update_field(product, V, Params) ->
685701
update_field(description, V, Params) ->
686702
Params#payproc_InvoiceTemplateUpdateParams{description = V};
687703
update_field(context, V, Params) ->
688-
Params#payproc_InvoiceTemplateUpdateParams{context = V}.
704+
Params#payproc_InvoiceTemplateUpdateParams{context = V};
705+
update_field(mutations, V, Params) ->
706+
Params#payproc_InvoiceTemplateUpdateParams{mutations = V}.
689707

690708
-spec make_lifetime(non_neg_integer(), non_neg_integer(), non_neg_integer()) -> lifetime_interval().
691709
make_lifetime(Y, M, D) ->

apps/hellgate/test/hg_invoice_template_tests_SUITE.erl

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
-export([create_invalid_cost_fixed_currency/1]).
1616
-export([create_invalid_cost_range/1]).
1717
-export([create_invoice_template/1]).
18+
-export([create_invoice_template_with_mutations/1]).
1819
-export([get_invoice_template_anyhow/1]).
1920
-export([update_invalid_party_status/1]).
2021
-export([update_invalid_shop_status/1]).
@@ -23,6 +24,7 @@
2324
-export([update_invalid_cost_range/1]).
2425
-export([update_invoice_template/1]).
2526
-export([update_with_cart/1]).
27+
-export([update_with_mutations/1]).
2628
-export([delete_invalid_party_status/1]).
2729
-export([delete_invalid_shop_status/1]).
2830
-export([delete_invoice_template/1]).
@@ -54,6 +56,7 @@ all() ->
5456
create_invalid_cost_fixed_currency,
5557
create_invalid_cost_range,
5658
create_invoice_template,
59+
create_invoice_template_with_mutations,
5760
get_invoice_template_anyhow,
5861
update_invalid_party_status,
5962
update_invalid_shop_status,
@@ -62,6 +65,7 @@ all() ->
6265
update_invalid_cost_range,
6366
update_invoice_template,
6467
update_with_cart,
68+
update_with_mutations,
6569
delete_invalid_party_status,
6670
delete_invalid_shop_status,
6771
delete_invoice_template,
@@ -193,6 +197,17 @@ create_invoice_template(C) ->
193197
ok = create_cost(make_cost(range, {inclusive, 42, <<"RUB">>}, {inclusive, 42, <<"RUB">>}), C),
194198
ok = create_cost(make_cost(range, {inclusive, 42, <<"RUB">>}, {inclusive, 100, <<"RUB">>}), C).
195199

200+
-spec create_invoice_template_with_mutations(config()) -> _.
201+
create_invoice_template_with_mutations(C) ->
202+
Client = cfg(client, C),
203+
Cost = make_cost(fixed, 42_00, <<"RUB">>),
204+
Mutations = make_mutations(),
205+
Product = <<"rubberduck">>,
206+
Lifetime = make_lifetime(0, 0, 2),
207+
#domain_InvoiceTemplate{id = TplID, mutations = Mutations} =
208+
create_invoice_tpl_w_mutations(C, Product, Lifetime, Cost, Mutations),
209+
#domain_InvoiceTemplate{mutations = Mutations} = hg_client_invoice_templating:get(TplID, Client).
210+
196211
create_cost(Cost, C) ->
197212
Product = <<"rubberduck">>,
198213
Details = hg_ct_helper:make_invoice_tpl_details(Product, Cost),
@@ -204,6 +219,22 @@ create_cost(Cost, C) ->
204219
} = create_invoice_tpl(C, Product, Lifetime, Cost),
205220
ok.
206221

222+
make_mutations() ->
223+
make_mutations(10_00).
224+
225+
make_mutations(Deviation) ->
226+
[
227+
{amount,
228+
{randomization, #domain_RandomizationMutationParams{
229+
deviation = Deviation,
230+
precision = 2,
231+
direction = both,
232+
min_amount_condition = 1,
233+
max_amount_condition = 10000_00,
234+
amount_multiplicity_condition = 1
235+
}}}
236+
].
237+
207238
-spec get_invoice_template_anyhow(config()) -> _.
208239
get_invoice_template_anyhow(C) ->
209240
PartyID = cfg(party_id, C),
@@ -379,6 +410,27 @@ update_with_cart(C) ->
379410
} = hg_client_invoice_templating:update(TplID, Diff, Client),
380411
#domain_InvoiceTemplate{} = hg_client_invoice_templating:get(TplID, Client).
381412

413+
-spec update_with_mutations(config()) -> _.
414+
update_with_mutations(C) ->
415+
Client = cfg(client, C),
416+
Cost = make_cost(fixed, 42_00, <<"RUB">>),
417+
Product = <<"rubberduck">>,
418+
Lifetime = make_lifetime(0, 0, 2),
419+
#domain_InvoiceTemplate{id = TplID, mutations = undefined} =
420+
create_invoice_tpl_w_mutations(C, Product, Lifetime, Cost, undefined),
421+
[
422+
begin
423+
Diff = make_invoice_tpl_update_params(#{mutations => M}),
424+
#domain_InvoiceTemplate{mutations = M} =
425+
hg_client_invoice_templating:update(TplID, Diff, Client)
426+
end
427+
|| M <- [
428+
make_mutations(),
429+
[],
430+
make_mutations(420_00)
431+
]
432+
].
433+
382434
-spec delete_invalid_party_status(config()) -> _.
383435
delete_invalid_party_status(C) ->
384436
Client = cfg(client, C),
@@ -484,6 +536,23 @@ create_invoice_tpl(Config, Product, Lifetime, Cost) ->
484536
Params = make_invoice_tpl_create_params(PartyID, ShopID, Lifetime, Product, Details),
485537
hg_client_invoice_templating:create(Params, Client).
486538

539+
create_invoice_tpl_w_mutations(Config, Product, Lifetime, Cost, Mutations) ->
540+
Client = cfg(client, Config),
541+
ShopID = cfg(shop_id, Config),
542+
PartyID = cfg(party_id, Config),
543+
Details = hg_ct_helper:make_invoice_tpl_details(Product, Cost),
544+
Params = hg_ct_helper:make_invoice_tpl_create_params(
545+
hg_utils:unique_id(),
546+
PartyID,
547+
ShopID,
548+
Lifetime,
549+
Product,
550+
Details,
551+
hg_ct_helper:make_invoice_context(),
552+
Mutations
553+
),
554+
hg_client_invoice_templating:create(Params, Client).
555+
487556
update_invalid_cost(Cost, amount, TplID, Client) ->
488557
update_invalid_cost(Cost, <<"Invalid amount">>, TplID, Client);
489558
update_invalid_cost(Cost, currency, TplID, Client) ->

apps/hellgate/test/hg_invoice_tests_SUITE.erl

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
-export([invalid_shop_status/1]).
3030
-export([invalid_invoice_template_cost/1]).
3131
-export([invalid_invoice_template_id/1]).
32-
-export([invoive_w_template_idempotency/1]).
32+
-export([invoice_w_template_idempotency/1]).
33+
-export([invoice_w_template_amount_randomization/1]).
3334
-export([invoice_w_template/1]).
3435
-export([invoice_cancellation/1]).
3536
-export([overdue_invoice_cancellation/1]).
@@ -308,7 +309,8 @@ groups() ->
308309
invalid_invoice_currency,
309310
invalid_invoice_template_cost,
310311
invalid_invoice_template_id,
311-
invoive_w_template_idempotency,
312+
invoice_w_template_idempotency,
313+
invoice_w_template_amount_randomization,
312314
invoice_w_template,
313315
invoice_cancellation,
314316
overdue_invoice_cancellation,
@@ -955,8 +957,8 @@ invalid_invoice_template_id(C) ->
955957
Params2 = hg_ct_helper:make_invoice_params_tpl(TplID2),
956958
{exception, #payproc_InvoiceTemplateRemoved{}} = hg_client_invoicing:create_with_tpl(Params2, Client).
957959

958-
-spec invoive_w_template_idempotency(config()) -> _ | no_return().
959-
invoive_w_template_idempotency(C) ->
960+
-spec invoice_w_template_idempotency(config()) -> _ | no_return().
961+
invoice_w_template_idempotency(C) ->
960962
Client = cfg(client, C),
961963
TplCost1 = {_, FixedCost} = make_tpl_cost(fixed, 10000, <<"RUB">>),
962964
TplContext1 = hg_ct_helper:make_invoice_context(<<"default context">>),
@@ -999,6 +1001,48 @@ invoive_w_template_idempotency(C) ->
9991001
external_id = ExternalID
10001002
}) = hg_client_invoicing:create_with_tpl(Params2, Client).
10011003

1004+
-spec invoice_w_template_amount_randomization(config()) -> _.
1005+
invoice_w_template_amount_randomization(C) ->
1006+
Client = cfg(client, C),
1007+
OriginalAmount = 1500_00,
1008+
TplCost1 = {_, FixedCost} = make_tpl_cost(fixed, OriginalAmount, <<"RUB">>),
1009+
TplContext1 = hg_ct_helper:make_invoice_context(<<"default context">>),
1010+
TplClient = cfg(client_tpl, C),
1011+
PartyID = cfg(party_id, C),
1012+
ShopID = cfg(shop_id, C),
1013+
Lifetime = hg_ct_helper:make_lifetime(0, 1, 0),
1014+
Product = <<"rubberduck">>,
1015+
Details = hg_ct_helper:make_invoice_tpl_details(Product, TplCost1),
1016+
TplParams = #payproc_InvoiceTemplateCreateParams{
1017+
template_id = hg_utils:unique_id(),
1018+
party_id = PartyID,
1019+
shop_id = ShopID,
1020+
invoice_lifetime = Lifetime,
1021+
product = Product,
1022+
details = Details,
1023+
context = TplContext1,
1024+
mutations = [
1025+
{amount,
1026+
{randomization, #domain_RandomizationMutationParams{
1027+
deviation = 10_00,
1028+
precision = 2,
1029+
direction = downward,
1030+
min_amount_condition = 50_00,
1031+
max_amount_condition = 10000_00,
1032+
amount_multiplicity_condition = 100_00
1033+
}}}
1034+
]
1035+
},
1036+
#domain_InvoiceTemplate{id = TplID} = hg_client_invoice_templating:create(TplParams, TplClient),
1037+
InvoiceID = hg_utils:unique_id(),
1038+
Params = hg_ct_helper:make_invoice_params_tpl(InvoiceID, TplID, FixedCost, hg_ct_helper:make_invoice_context()),
1039+
?invoice_state(#domain_Invoice{mutations = Mutations}) = hg_client_invoicing:create_with_tpl(Params, Client),
1040+
?assertMatch(
1041+
[{amount, #domain_InvoiceAmountMutation{original = OriginalAmount, mutated = Mutated}}] when
1042+
Mutated =< OriginalAmount,
1043+
Mutations
1044+
).
1045+
10021046
-spec invoice_w_template(config()) -> _ | no_return().
10031047
invoice_w_template(C) ->
10041048
Client = cfg(client, C),

0 commit comments

Comments
 (0)