[Rt-commit] rt branch, 4.2/validate-value-for-select-cf-2, created. rt-4.2.16-14-gdbdbd18e5c

Jim Brandt jbrandt at bestpractical.com
Tue Feb 16 16:47:28 EST 2021


The branch, 4.2/validate-value-for-select-cf-2 has been created
        at  dbdbd18e5cb6ba17e61c458ecf4b078532c72880 (commit)

- Log -----------------------------------------------------------------
commit f5d0c7d951be0559ed02be627e96d1fac2805421
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Mon Feb 15 10:54:38 2021 -0500

    Add test setting select CF to a value not in values list

diff --git a/t/customfields/single_values.t b/t/customfields/single_values.t
index 42ba479b44..3ea02a15d8 100644
--- a/t/customfields/single_values.t
+++ b/t/customfields/single_values.t
@@ -2,7 +2,7 @@ use warnings;
 use strict;
 
 use RT;
-use RT::Test nodata => 1, tests => 8;
+use RT::Test tests => undef;
 
 
 
@@ -28,9 +28,24 @@ my $t = RT::Ticket->new(RT->SystemUser);
 
 ok($id,$msg);
 is($t->CustomFieldValues($cf->id)->Count, 0, "No values yet");
-$t->AddCustomFieldValue(Field => $cf->id, Value => 'First');
+
+my $ok;
+my $value = 'First';
+($ok, $msg) = $t->AddCustomFieldValue(Field => $cf->id, Value => $value);
+ok( $ok, $msg );
 is($t->CustomFieldValues($cf->id)->Count, 1, "One now");
+is($t->FirstCustomFieldValue($cf->id), $value, "Value is $value");
+
+$value = 'Second';
+($ok, $msg) = $t->AddCustomFieldValue(Field => $cf->id, Value => $value);
+ok( $ok, $msg );
+is($t->CustomFieldValues($cf->id)->Count, 1, "Still one value");
+is($t->FirstCustomFieldValue($cf->id), $value, "Value is $value");
 
-$t->AddCustomFieldValue(Field => $cf->id, Value => 'Second');
+($ok, $msg) = $t->AddCustomFieldValue(Field => $cf->id, Value => 'Bogus');
+ok( !$ok, 'Returned false with value not in values list' );
+like( $msg, qr/Invalid value/, 'Message reports invalid value');
 is($t->CustomFieldValues($cf->id)->Count, 1, "Still one");
+is($t->FirstCustomFieldValue($cf->id), $value, "Value is still $value");
 
+done_testing();

commit 9c0f214632040a552a3f187440a42c344d2357b0
Author: Steven Burr <steve at bestpractical.com>
Date:   Fri Jan 15 11:04:24 2021 -0500

    Ensure values for Select CFs are in the defined list
    
    The values to which Custom Fields of type 'Select' are set should
    be constrained to the list of defined values. While the Web interface
    provided for this, the REST2 interface did not.
    
    The ValidateValue method is implemented on the CustomField object
    to ensure that values are valid for Select custom fields regardless
    of how they are set.
    
    Previously ValidateValue was already called in _AddCustomFieldValue,
    executing the auto-created DBIx::SearchBuilder method, which
    always passed by default. Since the call was already there, no
    additional call to ValidateValue needs to be added to activate
    this new validation.

diff --git a/lib/RT/CustomField.pm b/lib/RT/CustomField.pm
index f36213f9e2..1ddf8eb6a5 100644
--- a/lib/RT/CustomField.pm
+++ b/lib/RT/CustomField.pm
@@ -672,6 +672,39 @@ sub DeleteValue {
     return ($retval, $self->loc("Custom field value deleted"));
 }
 
+=head2 ValidateValue Value
+
+Make sure that the supplied value is valid
+
+=cut
+
+sub ValidateValue {
+    my $self = shift;
+    my $value = shift;
+
+    # NB: ensuring that the value (including possibly an empty one)
+    #     matches any validation pattern defined is already checked in
+    #     AddValueForObject and DeleteValueForObject
+
+    # For Select type custom fields, make sure the supplied value is
+    # in the list of defined values.
+    # Skip for external CFs since they could be more dynamic,
+    # depending on the external source.
+
+    if ( $self->Type eq "Select" && !$self->IsExternalValues() ) {
+        if ( $value ) {
+            my $cfvs = $self->Values;
+            while (my $cfv = $cfvs->Next) {
+                my $name = $cfv->Name;
+                return 1 if $name eq $value;
+            }
+            RT->Logger->info("'$value' is not a valid value for custom field " . $self->Name);
+            return 0;
+        }
+    }
+
+    return 1;
+}
 
 =head2 ValidateQueue Queue
 

commit fc8c6c656c7d4ad388b2ba31fd9dea995c7e5620
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Mon Feb 15 12:10:46 2021 -0500

    Set values for select CFs used in tests

diff --git a/t/api/action-createtickets.t b/t/api/action-createtickets.t
index ceed4231cc..2114426bad 100644
--- a/t/api/action-createtickets.t
+++ b/t/api/action-createtickets.t
@@ -2,7 +2,7 @@
 use strict;
 use warnings;
 use RT;
-use RT::Test tests => 54;
+use RT::Test tests => undef;
 
 
 {
@@ -25,6 +25,8 @@ my ($id, $msg)=  $global_cf->Create( Name => 'GlobalCF',
                                  Type=> 'SelectSingle');
 ok($id, 'Global custom field correctly created');
 
+($id,$msg) = $global_cf->AddValue(Name => 'A Value');
+ok($id,$msg);
 
 my $approvalsq = RT::Queue->new(RT->SystemUser);
 $approvalsq->Create(Name => 'Approvals');
@@ -40,7 +42,8 @@ my $queue_cf = RT::CustomField->new($RT::SystemUser);
 );
 ok($id, 'Queue-specific custom field correctly created');
 
-
+($id,$msg) = $queue_cf->AddValue(Name => 'Another Value');
+ok($id,$msg);
 
 my $approvals = 
 '===Create-Ticket: approval
@@ -266,3 +269,4 @@ foreach my $id ( sort keys %expected ) {
 
 }
 
+done_testing();

commit dbdbd18e5cb6ba17e61c458ecf4b078532c72880
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Mon Feb 15 12:11:33 2021 -0500

    Refine case-insensitive test for Select CF to use HasEntry
    
    The Validation update in 40f8cd4d5f no longer allows values
    to be added to a Select CF if the case is inconsistent.
    Refine the existing test to show the new validation and
    also show that HasEntry retains the previous
    case-insensitive check for backward compatibility.

diff --git a/t/customfields/repeated_values.t b/t/customfields/repeated_values.t
index 584512c7d2..8eccb9c432 100644
--- a/t/customfields/repeated_values.t
+++ b/t/customfields/repeated_values.t
@@ -82,13 +82,17 @@ my ( $ret, $msg );
     is( $ret, $ocfv->id, "got the same previous object" );
     is( $ticket->FirstCustomFieldValue($select_single), 'foo', 'value is still foo' );
 
-    diag "select values are case insensitive";
+    diag "HasEntry for select values is case insensitive";
 
     ( $ret, $msg ) =
       $ticket->AddCustomFieldValue( Field => $select_single, Value => 'FOO' );
-    is( $ret, $ocfv->id, "got the same previous object" );
+    is( $ret, 0, "Adding a new value is not case-insensitive" );
     is( $ticket->FirstCustomFieldValue($select_single), 'foo', 'value is still foo' );
 
+    my $select_values = $select_single->ValuesForObject($ticket);
+    my $entry = $select_values->HasEntry('FOO');
+    is( $entry->id, $ocfv->id, 'HasEntry is case insensitive' );
+
     ($ret, $msg) = $ticket->AddCustomFieldValue( Field => $select_single, Value => 'bar' );
     ok($ret, $msg);
     isnt( $ret, $ocfv->id, "got a new value" );

-----------------------------------------------------------------------


More information about the rt-commit mailing list