LCOV - code coverage report
Current view: top level - testing - testing_api_cmd_kyc_get.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 86.1 % 72 62
Test Date: 2026-09-07 12:06:38 Functions: 100.0 % 5 5

            Line data    Source code
       1              : /*
       2              :   This file is part of TALER
       3              :   Copyright (C) 2021 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_kyc_get.c
      21              :  * @brief command to test kyc_get request
      22              :  * @author Christian Grothoff
      23              :  */
      24              : #include "platform.h"
      25              : struct KycGetState;
      26              : #define TALER_MERCHANT_GET_PRIVATE_KYC_RESULT_CLOSURE struct KycGetState
      27              : #include <taler/taler_exchange_service.h>
      28              : #include <taler/taler_testing_lib.h>
      29              : #include "taler/taler_merchant_service.h"
      30              : #include "taler/taler_merchant_testing_lib.h"
      31              : #include <taler/merchant/get-private-kyc.h>
      32              : 
      33              : 
      34              : /**
      35              :  * State for a "/kyc" GET CMD.
      36              :  */
      37              : struct KycGetState
      38              : {
      39              :   /**
      40              :    * Operation handle for a GET /private/kyc GET request.
      41              :    */
      42              :   struct TALER_MERCHANT_GetPrivateKycHandle *kgh;
      43              : 
      44              :   /**
      45              :    * Base URL of the merchant serving the request.
      46              :    */
      47              :   const char *merchant_url;
      48              : 
      49              :   /**
      50              :    * Instance to query, NULL if part of @e merchant_url
      51              :    */
      52              :   const char *instance_id;
      53              : 
      54              :   /**
      55              :    * Reference to command providing wire hash, NULL to
      56              :    * query all accounts.
      57              :    */
      58              :   const char *h_wire_ref;
      59              : 
      60              :   /**
      61              :    * URL of exchange to query.
      62              :    */
      63              :   const char *exchange_url;
      64              : 
      65              :   /**
      66              :    * Set to the payto hash of the first account
      67              :    * for which we failed to pass the KYC check.
      68              :    */
      69              :   struct TALER_NormalizedPaytoHashP h_payto;
      70              : 
      71              :   /**
      72              :    * Access token the user needs to start a KYC process.
      73              :    */
      74              :   struct TALER_AccountAccessTokenP access_token;
      75              : 
      76              :   /**
      77              :    * Expected HTTP response code.
      78              :    */
      79              :   unsigned int expected_http_status;
      80              : 
      81              :   /**
      82              :    * Target for long-polling.
      83              :    */
      84              :   enum TALER_EXCHANGE_KycLongPollTarget lpt;
      85              : 
      86              :   /**
      87              :    * Expected KYC state.
      88              :    */
      89              :   bool expected_kyc_state;
      90              : 
      91              :   /**
      92              :    * Expected KYC state.
      93              :    */
      94              :   bool have_access_token;
      95              : 
      96              :   /**
      97              :    * Interpreter state.
      98              :    */
      99              :   struct TALER_TESTING_Interpreter *is;
     100              : 
     101              : };
     102              : 
     103              : 
     104              : /**
     105              :  * Free the state of a "/kyc" GET CMD, and
     106              :  * possibly cancel a pending "kyc" GET operation.
     107              :  *
     108              :  * @param cls closure with the `struct KycGetState`
     109              :  * @param cmd command currently being freed.
     110              :  */
     111              : static void
     112            9 : kyc_get_cleanup (void *cls,
     113              :                  const struct TALER_TESTING_Command *cmd)
     114              : {
     115            9 :   struct KycGetState *cs = cls;
     116              : 
     117            9 :   if (NULL != cs->kgh)
     118              :   {
     119            0 :     TALER_LOG_WARNING ("/kyc GET operation did not complete\n");
     120            0 :     TALER_MERCHANT_get_private_kyc_cancel (cs->kgh);
     121              :   }
     122            9 :   GNUNET_free (cs);
     123            9 : }
     124              : 
     125              : 
     126              : /**
     127              :  * Process "GET /public/kyc_get" (lookup) response.
     128              :  *
     129              :  * @param cls closure
     130              :  * @param kr response we got
     131              :  */
     132              : static void
     133            9 : kyc_get_cb (struct KycGetState *cs,
     134              :             const struct TALER_MERCHANT_GetPrivateKycResponse *kr)
     135              : {
     136              : 
     137            9 :   cs->kgh = NULL;
     138            9 :   if (kr->hr.http_status != cs->expected_http_status)
     139              :   {
     140            0 :     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
     141              :                 "Expected status %u, got %u\n",
     142              :                 cs->expected_http_status,
     143              :                 kr->hr.http_status);
     144            0 :     TALER_TESTING_FAIL (cs->is);
     145              :   }
     146            9 :   switch (kr->hr.http_status)
     147              :   {
     148            7 :   case MHD_HTTP_OK:
     149            7 :     if (! cs->expected_kyc_state)
     150              :     {
     151            0 :       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
     152              :                   "Expected KYC state %u, got %u\n",
     153              :                   cs->expected_kyc_state,
     154              :                   kr->details.ok.kycs_length);
     155            0 :       TALER_TESTING_FAIL (cs->is);
     156              :     }
     157            7 :     for (unsigned int i = 0; i<kr->details.ok.kycs_length; i++)
     158              :     {
     159              :       struct TALER_FullPayto payto_uri;
     160              : 
     161            7 :       payto_uri = kr->details.ok.kycs[i].payto_uri;
     162            7 :       if (NULL == payto_uri.full_payto)
     163              :       {
     164            0 :         continue;
     165              :       }
     166            7 :       TALER_full_payto_normalize_and_hash (payto_uri,
     167              :                                            &cs->h_payto);
     168            7 :       if (! kr->details.ok.kycs[i].no_access_token)
     169              :       {
     170              :         cs->access_token
     171            4 :           = kr->details.ok.kycs[i].access_token;
     172            4 :         cs->have_access_token = true;
     173              :       }
     174            7 :       break;
     175              :     }
     176            7 :     break;
     177              :   }
     178            9 :   TALER_TESTING_interpreter_next (cs->is);
     179              : }
     180              : 
     181              : 
     182              : /**
     183              :  * Run the "kyc_get" CMD.
     184              :  *
     185              :  * @param cls closure.
     186              :  * @param cmd command being currently run.
     187              :  * @param is interpreter state.
     188              :  */
     189              : static void
     190            9 : kyc_get_run (void *cls,
     191              :              const struct TALER_TESTING_Command *cmd,
     192              :              struct TALER_TESTING_Interpreter *is)
     193              : {
     194            9 :   struct KycGetState *cs = cls;
     195            9 :   const struct TALER_MerchantWireHashP *h_wire = NULL;
     196              : 
     197            9 :   cs->is = is;
     198            9 :   if (NULL != cs->h_wire_ref)
     199              :   {
     200              :     const struct TALER_TESTING_Command *wire_cmd;
     201              : 
     202            2 :     if (NULL ==
     203              :         (wire_cmd =
     204            2 :            TALER_TESTING_interpreter_lookup_command (cs->is,
     205              :                                                      cs->h_wire_ref)))
     206              :     {
     207            0 :       TALER_TESTING_FAIL (cs->is);
     208              :     }
     209              :     /* Note: at the time of writing, no command offers an h_wire trait,
     210              :        so for now this code is dead and 'h_wire_ref' must always be NULL... */
     211            2 :     if (GNUNET_OK !=
     212            2 :         TALER_TESTING_get_trait_h_wire (wire_cmd,
     213              :                                         &h_wire))
     214              :     {
     215            0 :       TALER_TESTING_FAIL (cs->is);
     216              :     }
     217              :   }
     218            9 :   cs->kgh = TALER_MERCHANT_get_private_kyc_create (
     219              :     TALER_TESTING_interpreter_get_context (is),
     220              :     cs->merchant_url);
     221            9 :   GNUNET_assert (NULL != cs->kgh);
     222            9 :   if (NULL != cs->instance_id)
     223            0 :     TALER_MERCHANT_get_private_kyc_set_options (
     224              :       cs->kgh,
     225              :       TALER_MERCHANT_get_private_kyc_option_instance_id (
     226              :         cs->instance_id));
     227            9 :   if (NULL != h_wire)
     228            2 :     TALER_MERCHANT_get_private_kyc_set_options (
     229              :       cs->kgh,
     230              :       TALER_MERCHANT_get_private_kyc_option_h_wire (h_wire));
     231            9 :   if (NULL != cs->exchange_url)
     232            9 :     TALER_MERCHANT_get_private_kyc_set_options (
     233              :       cs->kgh,
     234              :       TALER_MERCHANT_get_private_kyc_option_exchange_url (
     235              :         cs->exchange_url));
     236            9 :   if (TALER_EXCHANGE_KLPT_NONE != cs->lpt)
     237              :   {
     238            4 :     TALER_MERCHANT_get_private_kyc_set_options (
     239              :       cs->kgh,
     240              :       TALER_MERCHANT_get_private_kyc_option_lpt (cs->lpt),
     241              :       TALER_MERCHANT_get_private_kyc_option_timeout (
     242              :         GNUNET_TIME_UNIT_MINUTES));
     243              :   }
     244              :   {
     245              :     enum TALER_ErrorCode ec;
     246              : 
     247            9 :     ec = TALER_MERCHANT_get_private_kyc_start (cs->kgh,
     248              :                                                &kyc_get_cb,
     249              :                                                cs);
     250            9 :     GNUNET_assert (TALER_EC_NONE == ec);
     251              :   }
     252              : }
     253              : 
     254              : 
     255              : /**
     256              :  * Offer internal data from "KYC" GET CMD.
     257              :  *
     258              :  * @param cls closure.
     259              :  * @param[out] ret result (could be anything).
     260              :  * @param trait name of the trait.
     261              :  * @param index index number of the object to offer.
     262              :  * @return #GNUNET_OK on success.
     263              :  */
     264              : static enum GNUNET_GenericReturnValue
     265            2 : kyc_get_traits (void *cls,
     266              :                 const void **ret,
     267              :                 const char *trait,
     268              :                 unsigned int index)
     269              : {
     270            2 :   struct KycGetState *cs = cls;
     271              :   struct TALER_TESTING_Trait traits[] = {
     272              :     /* Must be first, skipped if we have no token! */
     273            2 :     TALER_TESTING_make_trait_account_access_token (
     274            2 :       &cs->access_token),
     275            2 :     TALER_TESTING_make_trait_h_normalized_payto (
     276            2 :       &cs->h_payto),
     277            2 :     TALER_TESTING_trait_end ()
     278              :   };
     279              : 
     280            4 :   return TALER_TESTING_get_trait (
     281            2 :     &traits[cs->have_access_token
     282              :             ? 0
     283            2 :             : 1],
     284              :     ret,
     285              :     trait,
     286              :     index);
     287              : }
     288              : 
     289              : 
     290              : struct TALER_TESTING_Command
     291            9 : TALER_TESTING_cmd_merchant_kyc_get (
     292              :   const char *label,
     293              :   const char *merchant_url,
     294              :   const char *instance_id,
     295              :   const char *h_wire_ref,
     296              :   const char *exchange_url,
     297              :   enum TALER_EXCHANGE_KycLongPollTarget lpt,
     298              :   unsigned int expected_http_status,
     299              :   bool expected_kyc_state)
     300              : {
     301              :   struct KycGetState *cs;
     302              : 
     303            9 :   cs = GNUNET_new (struct KycGetState);
     304            9 :   cs->merchant_url = merchant_url;
     305            9 :   cs->instance_id = instance_id;
     306            9 :   cs->h_wire_ref = h_wire_ref;
     307            9 :   cs->exchange_url = exchange_url;
     308            9 :   cs->lpt = lpt;
     309            9 :   cs->expected_http_status = expected_http_status;
     310            9 :   cs->expected_kyc_state = expected_kyc_state;
     311              :   {
     312            9 :     struct TALER_TESTING_Command cmd = {
     313              :       .cls = cs,
     314              :       .label = label,
     315              :       .run = &kyc_get_run,
     316              :       .cleanup = &kyc_get_cleanup,
     317              :       .traits = &kyc_get_traits
     318              :     };
     319              : 
     320            9 :     return cmd;
     321              :   }
     322              : }
     323              : 
     324              : 
     325              : /* end of testing_api_cmd_kyc_get.c */
        

Generated by: LCOV version 2.0-1