LCOV - code coverage report
Current view: top level - testing - testing_api_cmd_post_tokenfamilies.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 59.4 % 64 38
Test Date: 2026-09-11 17:45:24 Functions: 80.0 % 5 4

            Line data    Source code
       1              : /*
       2              :   This file is part of TALER
       3              :   Copyright (C) 2024 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              : /**
      21              :  * @file src/testing/testing_api_cmd_post_tokenfamilies.c
      22              :  * @brief command to run POST /tokenfamilies
      23              :  * @author Christian Blättler
      24              :  */
      25              : #include "platform.h"
      26              : struct PostTokenFamiliesState;
      27              : #define TALER_MERCHANT_POST_PRIVATE_TOKENFAMILIES_RESULT_CLOSURE struct PostTokenFamiliesState
      28              : #include <gnunet/gnunet_time_lib.h>
      29              : #include <taler/taler_exchange_service.h>
      30              : #include <taler/taler_testing_lib.h>
      31              : #include "taler/taler_merchant_service.h"
      32              : #include "taler/taler_merchant_testing_lib.h"
      33              : #include <taler/merchant/post-private-tokenfamilies.h>
      34              : 
      35              : 
      36              : /**
      37              :  * State of a "POST /tokenfamilies" CMD.
      38              :  */
      39              : struct PostTokenFamiliesState
      40              : {
      41              : 
      42              :   /**
      43              :    * Expected status code.
      44              :    */
      45              :   unsigned int http_status;
      46              : 
      47              :   /**
      48              :    * Handle for a "POST /tokenfamilies" request.
      49              :    */
      50              :   struct TALER_MERCHANT_PostPrivateTokenfamiliesHandle *handle;
      51              : 
      52              :   /**
      53              :    * The interpreter state.
      54              :    */
      55              :   struct TALER_TESTING_Interpreter *is;
      56              : 
      57              :   /**
      58              :    * Base URL of the merchant serving the request.
      59              :    */
      60              :   const char *merchant_url;
      61              : 
      62              :   /**
      63              :    * Slug of the token family.
      64              :    */
      65              :   const char *slug;
      66              : 
      67              :   /**
      68              :    * Name of the token family.
      69              :    */
      70              :   const char *name;
      71              : 
      72              :   /**
      73              :    * Description of the token family.
      74              :    */
      75              :   const char *description;
      76              : 
      77              :   /**
      78              :    * Map from IETF BCP 47 language tags to localized descriptions.
      79              :    */
      80              :   json_t *description_i18n;
      81              : 
      82              :   /**
      83              :    * Start of the validity period.
      84              :    */
      85              :   struct GNUNET_TIME_Timestamp valid_after;
      86              : 
      87              :   /**
      88              :    * End of the validity period.
      89              :    */
      90              :   struct GNUNET_TIME_Timestamp valid_before;
      91              : 
      92              :   /**
      93              :    * Validity duation of issued tokens of this family.
      94              :    */
      95              :   struct GNUNET_TIME_Relative duration;
      96              : 
      97              :   /**
      98              :    * Rounding duation of token family.
      99              :    */
     100              :   struct GNUNET_TIME_Relative rounding;
     101              : 
     102              :   /**
     103              :    * Kind of the token family. "subscription" or "discount".
     104              :    */
     105              :   const char *kind;
     106              : };
     107              : 
     108              : 
     109              : /**
     110              :  * Callback for a POST /tokenfamilies operation.
     111              :  *
     112              :  * @param cls closure for this function
     113              :  * @param tfr response being processed
     114              :  */
     115              : static void
     116            4 : post_tokenfamilies_cb (struct PostTokenFamiliesState *state,
     117              :                        const struct
     118              :                        TALER_MERCHANT_PostPrivateTokenfamiliesResponse *tfr)
     119              : {
     120              : 
     121            4 :   state->handle = NULL;
     122            4 :   if (state->http_status != tfr->hr.http_status)
     123              :   {
     124            0 :     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
     125              :                 "Unexpected response code %u (%d) to command %s\n",
     126              :                 tfr->hr.http_status,
     127              :                 (int) tfr->hr.ec,
     128              :                 TALER_TESTING_interpreter_get_current_label (state->is));
     129            0 :     TALER_TESTING_interpreter_fail (state->is);
     130            0 :     return;
     131              :   }
     132            4 :   switch (tfr->hr.http_status)
     133              :   {
     134            4 :   case MHD_HTTP_NO_CONTENT:
     135            4 :     break;
     136            0 :   case MHD_HTTP_UNAUTHORIZED:
     137            0 :     break;
     138            0 :   case MHD_HTTP_FORBIDDEN:
     139            0 :     break;
     140            0 :   case MHD_HTTP_NOT_FOUND:
     141            0 :     break;
     142            0 :   default:
     143            0 :     GNUNET_break (0);
     144            0 :     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
     145              :                 "Unhandled HTTP status %u for POST /tokenfamilies.\n",
     146              :                 tfr->hr.http_status);
     147              :   }
     148            4 :   TALER_TESTING_interpreter_next (state->is);
     149              : }
     150              : 
     151              : 
     152              : /**
     153              :  * Run the "POST /tokenfamilies" CMD.
     154              :  *
     155              :  *
     156              :  * @param cls closure.
     157              :  * @param cmd command being run now.
     158              :  * @param is interpreter state.
     159              :  */
     160              : static void
     161            4 : post_tokenfamilies_run (void *cls,
     162              :                         const struct TALER_TESTING_Command *cmd,
     163              :                         struct TALER_TESTING_Interpreter *is)
     164              : {
     165            4 :   struct PostTokenFamiliesState *state = cls;
     166              : 
     167            4 :   state->is = is;
     168            4 :   state->handle = TALER_MERCHANT_post_private_tokenfamilies_create (
     169              :     TALER_TESTING_interpreter_get_context (is),
     170              :     state->merchant_url,
     171              :     state->slug,
     172              :     state->name,
     173              :     state->description,
     174              :     state->valid_after,
     175              :     state->valid_before,
     176              :     state->duration,
     177              :     state->rounding,
     178            4 :     GNUNET_TIME_UNIT_ZERO, /* start_offset */
     179              :     state->kind);
     180            4 :   if (NULL != state->description_i18n)
     181              :   {
     182            0 :     TALER_MERCHANT_post_private_tokenfamilies_set_options (
     183              :       state->handle,
     184              :       TALER_MERCHANT_post_private_tokenfamilies_option_description_i18n (
     185              :         state->description_i18n));
     186              :   }
     187              :   {
     188              :     enum TALER_ErrorCode ec;
     189              : 
     190            4 :     ec = TALER_MERCHANT_post_private_tokenfamilies_start (
     191              :       state->handle,
     192              :       &post_tokenfamilies_cb,
     193              :       state);
     194            4 :     GNUNET_assert (TALER_EC_NONE == ec);
     195              :   }
     196            4 : }
     197              : 
     198              : 
     199              : /**
     200              :  * Offers information from the "POST /tokenfamilies" CMD state to other
     201              :  * commands.
     202              :  *
     203              :  * @param cls closure
     204              :  * @param[out] ret result (could be anything)
     205              :  * @param trait name of the trait
     206              :  * @param index index number of the object to extract.
     207              :  * @return #GNUNET_OK on success
     208              :  */
     209              : static enum GNUNET_GenericReturnValue
     210            0 : post_tokenfamilies_traits (void *cls,
     211              :                            const void **ret,
     212              :                            const char *trait,
     213              :                            unsigned int index)
     214              : {
     215            0 :   struct PostTokenFamiliesState *state = cls;
     216              :   struct TALER_TESTING_Trait traits[] = {
     217            0 :     TALER_TESTING_make_trait_token_family_slug (state->slug),
     218            0 :     TALER_TESTING_make_trait_timestamp (0,
     219            0 :                                         &state->valid_after),
     220            0 :     TALER_TESTING_make_trait_timestamp (1,
     221            0 :                                         &state->valid_before),
     222            0 :     TALER_TESTING_make_trait_token_family_duration (&state->duration),
     223            0 :     TALER_TESTING_make_trait_token_family_kind (state->kind),
     224            0 :     TALER_TESTING_trait_end ()
     225              :   };
     226              : 
     227            0 :   return TALER_TESTING_get_trait (traits,
     228              :                                   ret,
     229              :                                   trait,
     230              :                                   index);
     231              : }
     232              : 
     233              : 
     234              : /**
     235              :  * Free the state of a "POST /tokenfamilies" CMD, and possibly
     236              :  * cancel a pending operation thereof.
     237              :  *
     238              :  * @param cls closure.
     239              :  * @param cmd command being run.
     240              :  */
     241              : static void
     242            4 : post_tokenfamilies_cleanup (void *cls,
     243              :                             const struct TALER_TESTING_Command *cmd)
     244              : {
     245            4 :   struct PostTokenFamiliesState *state = cls;
     246              : 
     247            4 :   if (NULL != state->handle)
     248              :   {
     249            0 :     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
     250              :                 "POST /tokenfamilies operation did not complete\n");
     251            0 :     TALER_MERCHANT_post_private_tokenfamilies_cancel (state->handle);
     252              :   }
     253            4 :   json_decref (state->description_i18n);
     254            4 :   GNUNET_free (state);
     255            4 : }
     256              : 
     257              : 
     258              : struct TALER_TESTING_Command
     259            4 : TALER_TESTING_cmd_merchant_post_tokenfamilies (
     260              :   const char *label,
     261              :   const char *merchant_url,
     262              :   unsigned int http_status,
     263              :   const char *slug,
     264              :   const char *name,
     265              :   const char *description,
     266              :   json_t *description_i18n,
     267              :   struct GNUNET_TIME_Timestamp valid_after,
     268              :   struct GNUNET_TIME_Timestamp valid_before,
     269              :   struct GNUNET_TIME_Relative duration,
     270              :   struct GNUNET_TIME_Relative rounding,
     271              :   const char *kind) /* "subscription" or "discount" */
     272              : {
     273              :   struct PostTokenFamiliesState *state;
     274              : 
     275            4 :   GNUNET_assert ((NULL == description_i18n) ||
     276              :                  json_is_object (description_i18n));
     277            4 :   state = GNUNET_new (struct PostTokenFamiliesState);
     278            4 :   state->merchant_url = merchant_url;
     279            4 :   state->http_status = http_status;
     280            4 :   state->slug = slug;
     281            4 :   state->name = name;
     282            4 :   state->description = description;
     283            4 :   state->description_i18n = description_i18n; /* ownership taken */
     284            4 :   state->valid_after = valid_after;
     285            4 :   state->valid_before = valid_before;
     286            4 :   state->duration = duration;
     287            4 :   state->rounding = rounding;
     288            4 :   state->kind = kind;
     289              :   {
     290            4 :     struct TALER_TESTING_Command cmd = {
     291              :       .cls = state,
     292              :       .label = label,
     293              :       .run = &post_tokenfamilies_run,
     294              :       .cleanup = &post_tokenfamilies_cleanup,
     295              :       .traits = &post_tokenfamilies_traits
     296              :     };
     297              : 
     298            4 :     return cmd;
     299              :   }
     300              : }
        

Generated by: LCOV version 2.0-1