GDPR-IAB-TCFv2

 view release on metacpan or  search on metacpan

t/02-json-bitfield.t  view on Meta::CPAN

use strict;
use warnings;

use Test::More;

use GDPR::IAB::TCFv2;

# use JSON;
# use DateTime;
# use DateTimeX::TO_JSON formatter => 'DateTime::Format::RFC3339';

subtest "bitfield" => sub {
  subtest "should convert data to json using compact flag and 0/1 as booleans" => sub {
    subtest "should convert data to json using yyyymmdd as date format" => sub {
      my $consent = GDPR::IAB::TCFv2->Parse(
        'CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA',
        json => {
          verbose        => 0,
          compact        => 1,
          use_epoch      => 0,
          boolean_values => [0, 1],
          date_format    => '%Y%m%d',    # yyymmdd
        },
      );


      my $got      = $consent->TO_JSON();
      my $expected = _fixture_bitfield_compact(created => 20081207, last_updated => 20120110,);
      is_deeply $got, $expected, "must return the json hashref";

      done_testing;
    };

    subtest "should convert data to json using epoch date format" => sub {
      my $consent = GDPR::IAB::TCFv2->Parse(
        'CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA',
        json => {verbose => 0, compact => 1, use_epoch => 1, boolean_values => [0, 1],},
      );


      my $got      = $consent->TO_JSON();
      my $expected = _fixture_bitfield_compact(created => 1228644257, last_updated => 1326215413,);

      is_deeply $got, $expected, "must return the json hashref";

      done_testing;
    };

    done_testing;
  };

  subtest "should convert data to json using default (non-compact) and 0/1 as booleans" => sub {

    subtest "default non verbose, date as iso 8601" => sub {
      my $consent = GDPR::IAB::TCFv2->Parse(
        'CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA',
        json => {verbose => 0, compact => 0, use_epoch => 0, boolean_values => [0, 1],},
      );

      ok $consent->vendor_consent(27);

      my $got      = $consent->TO_JSON();
      my $expected = _fixture_bitfield_default();
      is_deeply $got, $expected, "must return the json hashref";

      done_testing;
    };

    subtest "default verbose, date as iso 8601" => sub {
      my $consent = GDPR::IAB::TCFv2->Parse(
        'CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA',
        json => {verbose => 1, compact => 0, use_epoch => 0, boolean_values => [0, 1],},
      );

      ok $consent->vendor_consent(27);

      my $got      = $consent->TO_JSON();
      my $expected = _fixture_bitfield_verbose();
      is_deeply $got, $expected, "must return the json hashref";

      done_testing;
    };

    done_testing;
  };

  subtest "publisher section" => sub {
    subtest "publisher section without publisher_tc" => sub {
      my $consent = GDPR::IAB::TCFv2->Parse('COwAdDhOwAdDhN4ABAENAPCgAAQAAv___wAAAFP_AAp_4AI6ACACAA',
        json => {verbose => 0, compact => 1, use_epoch => 0, boolean_values => [0, 1],},);

      my $got      = $consent->TO_JSON;
      my $expected = {"publisher" => {"restrictions" => {"7" => {"32" => 1}}}};

      is_deeply $got->{publisher}, $expected->{publisher}, "must return the same publisher restriction section";

      done_testing;
    };
    subtest "publisher section with publisher_tc" => sub {
      subtest "without custom purposes" => sub {
        my $consent = GDPR::IAB::TCFv2->Parse(
          'COwAdDhOwAdDhN4ABAENAPCgAAQAAv___wAAAFP_AAp_4AI6ACACAA.argAC0gAAAAAAAAAAAA',
          json => {verbose => 0, compact => 1, use_epoch => 0, boolean_values => [0, 1],},
        );

        my $got      = $consent->TO_JSON;
        my $expected = {
          "publisher" => {
            "consents"             => [2, 4, 6, 8, 9, 10],
            "legitimate_interests" => [2, 4, 5, 7, 10],
            "custom_purposes"      => {"consents" => [], "legitimate_interests" => [],},
            "restrictions"         => {"7"        => {"32" => 1}}
          }
        };

        is_deeply $got->{publisher}, $expected->{publisher}, "must return the same publisher restriction section";

        done_testing;
      };

      subtest "with custom purposes" => sub {
        my $consent = GDPR::IAB::TCFv2->Parse(
          'COwAdDhOwAdDhN4ABAENAPCgAAQAAv___wAAAFP_AAp_4AI6ACACAA.YAAAAAAAAXA',
          json => {verbose => 0, compact => 1, use_epoch => 0, boolean_values => [0, 1],},
        );

        my $got      = $consent->TO_JSON;
        my $expected = {
          "publisher" => {
            "consents"             => [],
            "legitimate_interests" => [],
            "custom_purposes"      => {"consents" => [1, 2], "legitimate_interests" => [1],},
            "restrictions"         => {"7"        => {"32" => 1}}
          }
        };

        is_deeply $got->{publisher}, $expected->{publisher}, "must return the same publisher restriction section";

        done_testing;
      };

      done_testing;
    };

    done_testing;
  };

  subtest "TO_JSON method should return the same hashref " => sub {
    my $consent = GDPR::IAB::TCFv2->Parse(
      'CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA',
      json => {verbose => 0, compact => 1, use_epoch => 0, boolean_values => [0, 1],},
    );


    my $got1 = $consent->TO_JSON();
    my $got2 = $consent->TO_JSON();

    is_deeply $got1, $got2, "must return the same hashref";

    done_testing;
  };

  done_testing;

};

done_testing;

sub _fixture_bitfield_compact {
  my (%extra) = @_;

  return {
    'special_features_opt_in' => [2],
    'use_non_standard_stacks' => 0,
    'last_updated'            => '2012-01-10T17:10:13Z',
    'policy_version'          => 2,
    'tc_string'               => 'CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA',
    'version'                 => 2,
    'consent_language'        => 'EN',
    'is_service_specific'     => 1,
    'vendor'                  => {
      'consents' => [
        2,  3,  6,  7,  8,  10, 12, 13, 14, 15, 16,  21,  25,  27,  30,  31, 34, 35, 37, 38,
        39, 42, 43, 49, 52, 54, 55, 56, 57, 59, 60,  63,  64,  65,  66,  67, 68, 69, 73, 74,
        76, 78, 83, 86, 87, 89, 90, 92, 96, 99, 100, 106, 109, 110, 114, 115
      ],
      'legitimate_interests' => [1, 9, 26, 27, 30, 36, 37, 43, 86, 97, 110, 113],
    },
    'purpose'                => {'consents' => [1, 3, 9, 10], 'legitimate_interests' => [3, 4, 5, 8, 9, 10],},
    'cmp_id'                 => 21,
    'created'                => '2008-12-07T10:04:17Z',
    'purpose_one_treatment'  => 0,
    'consent_screen'         => 2,
    'vendor_list_version'    => 23,
    'cmp_version'            => 7,
    'publisher_country_code' => 'KM',
    'publisher'              => {'restrictions' => {},},

    %extra
  };
}

sub _fixture_bitfield_default {
  my (%extra) = @_;

  return {
    'tc_string'        => 'CLcVDxRMWfGmWAVAHCENAXCkAKDAADnAABRgA5mdfCKZuYJez-NQm0TBMYA4oCAAGQYIAAAAAAEAIAEgAA',
    'consent_language' => 'EN',
    'purpose'          => {
      'consents'             => {'1' => 1, '3' => 1, '9' => 1, '10' => 1,},
      'legitimate_interests' => {'3' => 1, '4' => 1, '5' => 1, '8'  => 1, '9' => 1, '10' => 1,},



( run in 1.677 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )