[ Index ]

PHP Cross Reference of GlotPress

title

Body

[close]

/tests/phpunit/testcases/tests_things/ -> test_thing_original.php (source)

   1  <?php
   2  
   3  global $update_invocation_count;
   4  $update_invocation_count = 0;
   5  
   6  class MockOriginal extends GP_Original {
   7  	function update( $data, $where = null ) {
   8          $GLOBALS['update_invocation_count']++;
   9          return parent::update( $data, $where );
  10      }
  11  }
  12  
  13  class GP_Test_Thing_Original extends GP_UnitTestCase {
  14  
  15  	function create_original_with_update_counter( $original_args = array() ) {
  16          $project = $this->factory->project->create();
  17          /* We are doing it this hackish way, because I could not make the PHPUnit mocker to count the update() invocations */
  18          $mock_original = new MockOriginal;
  19          $this->factory->original = new GP_UnitTest_Factory_For_Original( $this->factory, $mock_original );
  20          $original = $this->factory->original->create( array_merge( array( 'project_id' => $project->id ), $original_args ) );
  21          // the object doesn't retrieve default values, we need to select it back from the database to get them
  22          $original->reload();
  23          return array( $project, $original );
  24      }
  25  
  26  	function create_translations_with( $entries ) {
  27          $translations = new Translations;
  28          foreach( $entries as $entry ) {
  29              $translations->add_entry( $entry );
  30          }
  31          return $translations;
  32      }
  33  
  34      function test_import_for_project_should_not_update_unchanged_originals() {
  35          list( $project, $original ) = $this->create_original_with_update_counter();
  36          $translations = $this->create_translations_with( array( array( 'singular' => $original->singular ) ) );
  37          $original->import_for_project( $project, $translations );
  38          $this->assertEquals( 0, $GLOBALS['update_invocation_count'], 'update should be invoked only 2 times' );
  39      }
  40  
  41      function test_import_for_project_should_update_changed_originals() {
  42          list( $project, $original ) = $this->create_original_with_update_counter( array(
  43              'comment' => 'Some comment'
  44          ) );
  45          $translations = $this->create_translations_with( array( array( 'singular' => $original->singular ) ) );
  46          $original->import_for_project( $project, $translations );
  47          $this->assertEquals( 1, $GLOBALS['update_invocation_count'], 'update should be invoked 3 times' );
  48      }
  49  
  50  	function test_import_for_project_should_update_cache() {
  51          $project  = $this->factory->project->create();
  52          $original = $this->factory->original->create( array( 'project_id' => $project->id, 'status' => '+active', 'singular' => 'baba' ) );
  53  
  54          $translations_array = array( array( 'singular' => $original->singular ), array( 'singular' => 'dyado' ) );
  55          $translations       = $this->create_translations_with( $translations_array );
  56          $original->import_for_project( $project, $translations );
  57  
  58          $this->assertEquals( count( $translations_array ), $original->count_by_project_id( $project->id ) );
  59      }
  60  
  61      function test_is_different_from_should_return_true_if_only_singular_is_for_update_and_it_is_the_same() {
  62          $original = $this->factory->original->create();
  63          $this->assertFalse( GP::$original->is_different_from( array( 'singular' => $original->singular ), $original ) );
  64      }
  65  
  66      function test_is_different_from_should_return_true_if_one_value_is_empty_string_and_the_other_is_null() {
  67          $original = $this->factory->original->create( array( 'comment' => NULL ) );
  68          $this->assertFalse( GP::$original->is_different_from( array( 'singular' => $original->singular, 'comment' => '' ), $original ) );
  69      }
  70  
  71      function test_is_different_from_should_use_this_if_second_argument_is_not_supplied() {
  72          $original = $this->factory->original->create();
  73          $data = array( 'singular' => 'baba' );
  74          $this->assertEquals( GP::$original->is_different_from( $data, $original ), $original->is_different_from( $data )  );
  75      }
  76  
  77      /**
  78       * @ticket gh-301
  79       */
  80      function test_original_should_validate_if_singular_is_zero() {
  81          $project = $this->factory->project->create();
  82          $original = $this->factory->original->create( array( 'project_id' => $project->id, 'status' => '+active', 'singular' => '0', 'priority' => -1 ) );
  83          $this->assertTrue( $original->validate() );
  84      }
  85  
  86      function test_import_should_leave_unchanged_strings_as_active() {
  87          $project = $this->factory->project->create();
  88          $original = $this->factory->original->create( array( 'project_id' => $project->id, 'status' => '+active', 'singular' => 'baba' ) );
  89          $translations = $this->create_translations_with( array( array( 'singular' => 'baba' ) ) );
  90          $original->import_for_project( $project, $translations );
  91          $originals_for_project = $original->by_project_id( $project->id );
  92          $this->assertEquals( 1, count( $originals_for_project ) );
  93          $this->assertEquals( 'baba', $originals_for_project[0]->singular );
  94      }
  95  
  96      function test_import_should_mark_translation_of_changed_strings_as_fuzzy() {
  97          $set = $this->factory->translation_set->create_with_project_and_locale();
  98          $original = $this->factory->original->create( array( 'project_id' => $set->project->id, 'status' => '+active', 'singular' => 'baba baba' ) );
  99          $translation = $this->factory->translation->create( array( 'translation_set_id' => $set->id, 'original_id' => $original->id, 'status' => 'current' ) );
 100          $translations_for_import = $this->create_translations_with( array( array( 'singular' => 'baba baba.' ) ) );
 101  
 102          list( $originals_added, $originals_existing, $originals_fuzzied, $originals_obsoleted, $originals_error ) = $original->import_for_project( $set->project, $translations_for_import );
 103  
 104          $this->assertEquals( 0, $originals_added );
 105          $this->assertEquals( 0, $originals_existing );
 106          $this->assertEquals( 1, $originals_fuzzied );
 107          $this->assertEquals( 0, $originals_obsoleted );
 108          $this->assertEquals( 0, $originals_error );
 109  
 110          $current_translations = GP::$translation->find_many( "original_id = '{$original->id}' AND status = 'current'" );
 111          $fuzzy_translations = GP::$translation->find_many( "original_id = '{$original->id}' AND status = 'fuzzy'" );
 112  
 113          $this->assertEquals( 0, count( $current_translations ) );
 114          $this->assertEquals( 1, count( $fuzzy_translations ) );
 115      }
 116  
 117      function test_import_should_not_mark_translation_of_changed_strings_as_fuzzy_with_filter() {
 118          $set = $this->factory->translation_set->create_with_project_and_locale();
 119          $original = $this->factory->original->create( array( 'project_id' => $set->project->id, 'status' => '+active', 'singular' => 'baba baba' ) );
 120          $translation = $this->factory->translation->create( array( 'translation_set_id' => $set->id, 'original_id' => $original->id, 'status' => 'current' ) );
 121          $translations_for_import = $this->create_translations_with( array( array( 'singular' => 'baba baba.' ) ) );
 122  
 123          add_filter( 'gp_set_translations_for_original_to_fuzzy', '__return_false' );
 124  
 125          list( $originals_added, $originals_existing, $originals_fuzzied, $originals_obsoleted, $originals_error ) = $original->import_for_project( $set->project, $translations_for_import );
 126  
 127          remove_filter( 'gp_set_translations_for_original_to_fuzzy', '__return_false' );
 128  
 129          $this->assertEquals( 0, $originals_added );
 130          $this->assertEquals( 1, $originals_existing );
 131          $this->assertEquals( 0, $originals_fuzzied );
 132          $this->assertEquals( 0, $originals_obsoleted );
 133          $this->assertEquals( 0, $originals_error );
 134  
 135          $current_translations = GP::$translation->find_many( "original_id = '{$original->id}' AND status = 'current'" );
 136          $fuzzy_translations = GP::$translation->find_many( "original_id = '{$original->id}' AND status = 'fuzzy'" );
 137  
 138          $this->assertEquals( 1, count( $current_translations ) );
 139          $this->assertEquals( 0, count( $fuzzy_translations ) );
 140      }
 141  
 142      /**
 143       * @ticket 508
 144       */
 145  	function test_import_should_clean_project_count_cache() {
 146          $set = $this->factory->translation_set->create_with_project_and_locale();
 147          $original = $this->factory->original->create( array( 'project_id' => $set->project->id, 'status' => '+obsolete', 'singular' => 'baba baba' ) );
 148  
 149          $count = $original->count_by_project_id( $set->project->id );
 150          $this->assertEquals( 0, $count );
 151  
 152          $translations_for_import = $this->create_translations_with( array( array( 'singular' => 'baba baba' ) ) );
 153  
 154          list( $originals_added, $originals_existing, $originals_fuzzied, $originals_obsoleted, $originals_error ) = $original->import_for_project( $set->project, $translations_for_import );
 155  
 156          $this->assertEquals( 0, $originals_added );
 157          $this->assertEquals( 1, $originals_existing );
 158          $this->assertEquals( 0, $originals_fuzzied );
 159          $this->assertEquals( 0, $originals_obsoleted );
 160          $this->assertEquals( 0, $originals_error );
 161  
 162          $count = $original->count_by_project_id( $set->project->id );
 163          $this->assertEquals( 1, $count );
 164      }
 165  
 166      function test_import_should_remove_from_active_missing_strings() {
 167          $project = $this->factory->project->create();
 168          $original = $this->factory->original->create( array( 'project_id' => $project->id, 'status' => '+active' ) );
 169          $original->import_for_project( $project, new Translations );
 170          $originals_for_project = $original->by_project_id( $project->id );
 171          $this->assertEquals( 0, count( $originals_for_project ) );
 172      }
 173  
 174      function test_normalize_fields_should_convert_named_priorities_to_numeric_by_name() {
 175          $original = new GP_Original;
 176          $normalized_args =     $original->normalize_fields( array( 'priority' => 'hidden' ) );
 177          $this->assertEquals( -2, $normalized_args['priority'] );
 178      }
 179  
 180      function test_normalize_fields_should_not_convert_numeric_priorities_to_numeric_by_name() {
 181          $original = new GP_Original;
 182          $normalized_args =     $original->normalize_fields( array( 'priority' => '1' ) );
 183          $this->assertEquals( 1, $normalized_args['priority'] );
 184      }
 185  
 186      function test_normalize_fields_should_unset_priority_if_named_priority_is_missing() {
 187          $original = new GP_Original;
 188          $normalized_args =     $original->normalize_fields( array( 'priority' => 'baba' ) );
 189          $this->assertFalse( isset( $normalized_args['priority'] ) );
 190      }
 191  
 192      function test_by_project_id_and_entry_should_match_case() {
 193          $project = $this->factory->project->create();
 194          $original = $this->factory->original->create( array( 'project_id' => $project->id, 'status' => '+active', 'singular' => 'Baba' ) );
 195  
 196          $entry = new stdClass();
 197          $entry->singular = 'BABA';
 198  
 199          $by_project_id_and_entry = GP::$original->by_project_id_and_entry( $project->id, $entry );
 200          $this->assertEquals( false, $by_project_id_and_entry );
 201  
 202          $entry->singular = 'Baba';
 203          $by_project_id_and_entry = GP::$original->by_project_id_and_entry( $project->id, $entry );
 204          $this->assertSame( $original->singular, $by_project_id_and_entry->singular );
 205      }
 206  
 207      /**
 208       * @ticket gh-302
 209       */
 210      function test_import_for_project_with_context_which_exceeds_the_maximum_length_of_255() {
 211          $project = $this->factory->project->create();
 212  
 213          // Insert an original with a context with 255 chars. It shouldn't be removed.
 214          $this->factory->original->create( array( 'project_id' => $project->id, 'status' => '+active', 'singular' => 'foo', 'context' => str_repeat( 'a', 255 ) ) );
 215  
 216          /*
 217           * Create three originals.
 218           * 1) Same as existing original, but with 256 chars.
 219           * 2) New original wit 256 chars.
 220           * 3) New original with 255 chars.
 221           */
 222          $test_originals = array(
 223              array( 'singular' => 'foo', 'context' => str_repeat( 'a', 256 ) ),
 224              array( 'singular' => 'bar', 'context' => str_repeat( 'b', 256 ) ),
 225              array( 'singular' => 'bab', 'context' => str_repeat( 'c', 255 ) ),
 226          );
 227  
 228          // First import:
 229  
 230          $translations_for_import = $this->create_translations_with( $test_originals );
 231          list( $originals_added, $originals_existing, $originals_fuzzied, $originals_obsoleted, $originals_error ) = GP::$original->import_for_project( $project, $translations_for_import );
 232  
 233          // Only two new originals.
 234          $this->assertEquals( 2, $originals_added );
 235          $this->assertEquals( 0, $originals_existing );
 236          $this->assertEquals( 0, $originals_fuzzied );
 237          $this->assertEquals( 0, $originals_obsoleted );
 238          $this->assertEquals( 0, $originals_error );
 239  
 240          $originals = GP::$original->by_project_id( $project->id );
 241          $this->assertCount( 3, $originals );
 242  
 243          // Second import:
 244  
 245          $translations_for_import = $this->create_translations_with( $test_originals );
 246          list( $originals_added, $originals_existing, $originals_fuzzied, $originals_obsoleted, $originals_error ) = GP::$original->import_for_project( $project, $translations_for_import );
 247  
 248          // Originals are already imported, no change.
 249          $this->assertEquals( 0, $originals_added );
 250          $this->assertEquals( 0, $originals_existing );
 251          $this->assertEquals( 0, $originals_fuzzied );
 252          $this->assertEquals( 0, $originals_obsoleted );
 253          $this->assertEquals( 0, $originals_error );
 254  
 255          $originals = GP::$original->by_project_id( $project->id );
 256          $this->assertCount( 3, $originals );
 257  
 258          // Get the first item.
 259          $original = reset( $originals );
 260          $this->assertSame( str_repeat( 'a', 255 ), $original->context );
 261      }
 262  
 263      /**
 264       * @ticket gh-397
 265       */
 266  	function test_return_types_of_count_by_project_id() {
 267          $project = $this->factory->project->create();
 268  
 269          $this->factory->original->create( array( 'project_id' => $project->id, 'status' => '+active', 'singular' => 'Foo' ) );
 270          $this->factory->original->create( array( 'project_id' => $project->id, 'status' => '+active', 'singular' => 'Bar', 'priority' => -2 ) );
 271  
 272          $total = GP::$original->count_by_project_id( $project->id );
 273          $this->assertSame( 2, $total );
 274  
 275          $all = GP::$original->count_by_project_id( $project->id, 'all' );
 276          $this->assertInternalType( 'object', $all );
 277          $this->assertSame( 2, $all->total );
 278          $this->assertSame( 1, $all->hidden );
 279          $this->assertSame( 1, $all->public );
 280  
 281          $hidden = GP::$original->count_by_project_id( $project->id, 'hidden' );
 282          $this->assertSame( 1, $hidden );
 283  
 284          $public = GP::$original->count_by_project_id( $project->id, 'public' );
 285          $this->assertSame( 1, $public );
 286  
 287          $non_existent = GP::$original->count_by_project_id( $project->id, 'non_existent' );
 288          $this->assertSame( 0, $non_existent );
 289      }
 290  
 291  	public function test_previous_state_is_passed_to_saved_action() {
 292          $project = $this->factory->project->create();
 293          $original = $this->factory->original->create( array( 'project_id' => $project->id, 'status' => '+active', 'singular' => 'Before' ) );
 294          $initial_original = clone $original;
 295  
 296          $previous_original = null;
 297          $closure = function( $original_after, $original_before ) use ( &$previous_original ) {
 298              $previous_original = $original_before;
 299          };
 300  
 301          add_action( 'gp_original_saved', $closure, 10, 2 );
 302  
 303          $original->save( array( 'singular' => 'After' ) );
 304  
 305          remove_action( 'gp_original_saved', $closure );
 306  
 307          $this->assertEquals( $initial_original, $previous_original );
 308          $this->assertEquals( $previous_original->singular, 'Before' );
 309          $this->assertEquals( $original->singular, 'After' );
 310      }
 311  
 312  	public function test_delete() {
 313          $set = $this->factory->translation_set->create_with_project_and_locale();
 314          $translation = $this->factory->translation->create_with_original_for_translation_set( $set );
 315  
 316          $original = GP::$original->get( $translation->original_id );
 317          $this->assertSame( 1, $original->delete() );
 318  
 319          // Check if translations are deleted too.
 320          $translation = GP::$translation->find_one( array( 'id' => $translation->id ) );
 321          $this->assertFalse( $translation );
 322      }
 323  
 324      /**
 325       * @ticket gh-1340
 326       */
 327  	function test_import_should_respect_priority_in_flags() {
 328          $project = $this->factory->project->create();
 329          $original = $this->factory->original->create( array( 'project_id' => $project->id, 'status' => '+active', 'singular' => 'baba' ) );
 330  
 331          $translations = $this->create_translations_with(
 332              array(
 333                  array( 'singular' => 'baba', 'flags' => array( 'gp-priority: low' ) ),
 334                  array( 'singular' => 'baba baba' ),
 335                  array( 'singular' => 'baba baba baba', 'flags' => array( 'gp-priority: high' ) ),
 336                  array( 'singular' => 'priority flag should be ignored.', 'flags' => array( 'gp-priority: unexpected' ) ),
 337              )
 338          );
 339  
 340          $original->import_for_project( $project, $translations );
 341  
 342          $originals_for_project = $original->by_project_id( $project->id );
 343          $this->assertEquals( 4, count( $originals_for_project ) );
 344  
 345          $this->assertEquals( -1, $originals_for_project[0]->priority, 'Existing string should have been updated to be low-priority.' );
 346          $this->assertEquals( 0, $originals_for_project[1]->priority, 'New string should have imported as normal priority.' );
 347          $this->assertEquals( 1, $originals_for_project[2]->priority, 'New string should have imported as high priority.' );
 348          $this->assertEquals( 0, $originals_for_project[3]->priority, 'New string with invalid priority flag should have imported as normal priority.' );
 349      }
 350  
 351  }


Generated: Tue Mar 19 01:01:21 2024 Cross-referenced by PHPXref 0.7.1