LCOV - code coverage report
Current view: top level - testing - testing_api_cmd_post_units.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 89.5 % 57 51
Test Date: 2026-09-11 17:45:24 Functions: 100.0 % 5 5

            Line data    Source code
       1              : /*
       2              :   This file is part of TALER
       3              :   Copyright (C) 2025 Taler Systems SA
       4              : 
       5              :   TALER is free software; you can redistribute it and/or modify
       6              :   it under the terms of the GNU General Public License as
       7              :   published by the Free Software Foundation; either version 3, or
       8              :   (at your option) any later version.
       9              : 
      10              :   TALER is distributed in the hope that it will be useful, but
      11              :   WITHOUT ANY WARRANTY; without even the implied warranty of
      12              :   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13              :   GNU General Public License for more details.
      14              : 
      15              :   You should have received a copy of the GNU General Public
      16              :   License along with TALER; see the file COPYING.  If not, see
      17              :   <http://www.gnu.org/licenses/>
      18              : */
      19              : /**
      20              :  * @file src/testing/testing_api_cmd_post_units.c
      21              :  * @brief command to test POST /private/units
      22              :  * @author Bohdan Potuzhnyi
      23              :  */
      24              : #include "platform.h"
      25              : struct PostUnitState;
      26              : #define TALER_MERCHANT_POST_PRIVATE_UNITS_RESULT_CLOSURE struct PostUnitState
      27              : #include <taler/taler_testing_lib.h>
      28              : #include "taler/taler_merchant_service.h"
      29              : #include "taler/taler_merchant_testing_lib.h"
      30              : #include <taler/merchant/post-private-units.h>
      31              : 
      32              : 
      33              : /**
      34              :  * State for a POST /private/units command.
      35              :  */
      36              : struct PostUnitState
      37              : {
      38              :   /**
      39              :    * In-flight request handle.
      40              :    */
      41              :   struct TALER_MERCHANT_PostPrivateUnitsHandle *uph;
      42              : 
      43              :   /**
      44              :    * Interpreter context.
      45              :    */
      46              :   struct TALER_TESTING_Interpreter *is;
      47              : 
      48              :   /**
      49              :    * Merchant backend base URL.
      50              :    */
      51              :   const char *merchant_url;
      52              : 
      53              :   /**
      54              :    * Unit identifier.
      55              :    */
      56              :   const char *unit_id;
      57              : 
      58              :   /**
      59              :    * Long label.
      60              :    */
      61              :   const char *unit_name_long;
      62              : 
      63              :   /**
      64              :    * Short label.
      65              :    */
      66              :   const char *unit_name_short;
      67              : 
      68              :   /**
      69              :    * Optional translations (reference counted).
      70              :    */
      71              :   json_t *unit_name_long_i18n;
      72              : 
      73              :   /**
      74              :    * Optional translations (reference counted).
      75              :    */
      76              :   json_t *unit_name_short_i18n;
      77              : 
      78              :   /**
      79              :    * Whether fractional quantities are allowed.
      80              :    */
      81              :   bool unit_allow_fraction;
      82              : 
      83              :   /**
      84              :    * Precision level for fractional quantities.
      85              :    */
      86              :   uint32_t unit_precision_level;
      87              : 
      88              :   /**
      89              :    * Whether the unit should be active.
      90              :    */
      91              :   bool unit_active;
      92              : 
      93              :   /**
      94              :    * Expected HTTP status.
      95              :    */
      96              :   unsigned int http_status;
      97              : };
      98              : 
      99              : 
     100              : /**
     101              :  * Completion callback for POST /private/units.
     102              :  */
     103              : static void
     104            8 : post_unit_cb (struct PostUnitState *pus,
     105              :               const struct TALER_MERCHANT_PostPrivateUnitsResponse *pur)
     106              : {
     107              : 
     108            8 :   pus->uph = NULL;
     109            8 :   if (pus->http_status != pur->hr.http_status)
     110              :   {
     111            0 :     TALER_TESTING_unexpected_status_with_body (pus->is,
     112              :                                                pur->hr.http_status,
     113              :                                                pus->http_status,
     114              :                                                pur->hr.reply);
     115            0 :     return;
     116              :   }
     117            8 :   TALER_TESTING_interpreter_next (pus->is);
     118              : }
     119              : 
     120              : 
     121              : /**
     122              :  * Issue the POST /private/units request.
     123              :  */
     124              : static void
     125            8 : post_unit_run (void *cls,
     126              :                const struct TALER_TESTING_Command *cmd,
     127              :                struct TALER_TESTING_Interpreter *is)
     128              : {
     129            8 :   struct PostUnitState *pus = cls;
     130              : 
     131            8 :   pus->is = is;
     132            8 :   pus->uph = TALER_MERCHANT_post_private_units_create (
     133              :     TALER_TESTING_interpreter_get_context (is),
     134              :     pus->merchant_url,
     135              :     pus->unit_id,
     136              :     pus->unit_name_long,
     137              :     pus->unit_name_short);
     138            8 :   TALER_MERCHANT_post_private_units_set_options (
     139              :     pus->uph,
     140              :     TALER_MERCHANT_post_private_units_option_unit_allow_fraction (
     141              :       pus->unit_allow_fraction),
     142              :     TALER_MERCHANT_post_private_units_option_unit_precision_level (
     143              :       pus->unit_precision_level),
     144              :     TALER_MERCHANT_post_private_units_option_unit_active (
     145              :       pus->unit_active));
     146            8 :   if (NULL != pus->unit_name_long_i18n)
     147            6 :     TALER_MERCHANT_post_private_units_set_options (
     148              :       pus->uph,
     149              :       TALER_MERCHANT_post_private_units_option_unit_name_long_i18n (
     150              :         pus->unit_name_long_i18n));
     151            8 :   if (NULL != pus->unit_name_short_i18n)
     152            6 :     TALER_MERCHANT_post_private_units_set_options (
     153              :       pus->uph,
     154              :       TALER_MERCHANT_post_private_units_option_unit_name_short_i18n (
     155              :         pus->unit_name_short_i18n));
     156              :   {
     157              :     enum TALER_ErrorCode ec;
     158              : 
     159            8 :     ec = TALER_MERCHANT_post_private_units_start (
     160              :       pus->uph,
     161              :       &post_unit_cb,
     162              :       pus);
     163            8 :     if (TALER_EC_NONE != ec)
     164              :     {
     165            0 :       GNUNET_break (0);
     166            0 :       TALER_TESTING_interpreter_fail (is);
     167              :     }
     168              :   }
     169            8 : }
     170              : 
     171              : 
     172              : /**
     173              :  * Provide traits for other commands.
     174              :  */
     175              : static enum GNUNET_GenericReturnValue
     176           32 : post_unit_traits (void *cls,
     177              :                   const void **ret,
     178              :                   const char *trait,
     179              :                   unsigned int index)
     180              : {
     181           32 :   struct PostUnitState *pus = cls;
     182              :   struct TALER_TESTING_Trait traits[] = {
     183           32 :     TALER_TESTING_make_trait_unit_id (pus->unit_id),
     184           32 :     TALER_TESTING_make_trait_unit_name_long (pus->unit_name_long),
     185           32 :     TALER_TESTING_make_trait_unit_name_short (pus->unit_name_short),
     186           32 :     TALER_TESTING_make_trait_unit_allow_fraction (&pus->unit_allow_fraction),
     187           32 :     TALER_TESTING_make_trait_unit_precision_level (&pus->unit_precision_level),
     188           32 :     TALER_TESTING_make_trait_unit_active (&pus->unit_active),
     189           32 :     TALER_TESTING_make_trait_unit_name_long_i18n (pus->unit_name_long_i18n),
     190           32 :     TALER_TESTING_make_trait_unit_name_short_i18n (pus->unit_name_short_i18n),
     191           32 :     TALER_TESTING_trait_end ()
     192              :   };
     193              : 
     194           32 :   return TALER_TESTING_get_trait (traits,
     195              :                                   ret,
     196              :                                   trait,
     197              :                                   index);
     198              : }
     199              : 
     200              : 
     201              : /**
     202              :  * Cleanup / cancel pending request.
     203              :  */
     204              : static void
     205            8 : post_unit_cleanup (void *cls,
     206              :                    const struct TALER_TESTING_Command *cmd)
     207              : {
     208            8 :   struct PostUnitState *pus = cls;
     209              : 
     210            8 :   if (NULL != pus->uph)
     211              :   {
     212            0 :     TALER_MERCHANT_post_private_units_cancel (pus->uph);
     213            0 :     pus->uph = NULL;
     214              :   }
     215            8 :   if (NULL != pus->unit_name_long_i18n)
     216            6 :     json_decref (pus->unit_name_long_i18n);
     217            8 :   if (NULL != pus->unit_name_short_i18n)
     218            6 :     json_decref (pus->unit_name_short_i18n);
     219            8 :   GNUNET_free (pus);
     220            8 : }
     221              : 
     222              : 
     223              : struct TALER_TESTING_Command
     224            8 : TALER_TESTING_cmd_merchant_post_units (const char *label,
     225              :                                        const char *merchant_url,
     226              :                                        const char *unit_id,
     227              :                                        const char *unit_name_long,
     228              :                                        const char *unit_name_short,
     229              :                                        bool unit_allow_fraction,
     230              :                                        uint32_t unit_precision_level,
     231              :                                        bool unit_active,
     232              :                                        json_t *unit_name_long_i18n,
     233              :                                        json_t *unit_name_short_i18n,
     234              :                                        unsigned int http_status)
     235              : {
     236              :   struct PostUnitState *pus;
     237              : 
     238            8 :   pus = GNUNET_new (struct PostUnitState);
     239            8 :   pus->merchant_url = merchant_url;
     240            8 :   pus->unit_id = unit_id;
     241            8 :   pus->unit_name_long = unit_name_long;
     242            8 :   pus->unit_name_short = unit_name_short;
     243            8 :   pus->unit_allow_fraction = unit_allow_fraction;
     244            8 :   pus->unit_precision_level = unit_precision_level;
     245            8 :   pus->unit_active = unit_active;
     246            8 :   pus->unit_name_long_i18n = unit_name_long_i18n;
     247            8 :   pus->unit_name_short_i18n = unit_name_short_i18n;
     248            8 :   pus->http_status = http_status;
     249              :   {
     250            8 :     struct TALER_TESTING_Command cmd = {
     251              :       .cls = pus,
     252              :       .label = label,
     253              :       .run = &post_unit_run,
     254              :       .cleanup = &post_unit_cleanup,
     255              :       .traits = &post_unit_traits
     256              :     };
     257              : 
     258            8 :     return cmd;
     259              :   }
     260              : }
     261              : 
     262              : 
     263              : /* end of testing_api_cmd_post_units.c */
        

Generated by: LCOV version 2.0-1