def test_entity_project_locale_order(entity_test_models): """ Return entities in correct order. """ resource0 = entity_test_models[0].entity.resource locale_a = entity_test_models[0].locale project_a = resource0.project EntityFactory.create( order=2, resource=resource0, string='Second String', ) EntityFactory.create( order=1, resource=resource0, string='First String', ) entities = Entity.map_entities( locale_a, Entity.for_project_locale( project_a, locale_a, ), ) assert entities[1]['original'] == 'First String' assert entities[2]['original'] == 'Second String'
def test_locale_parts_stats_no_page_multiple_resources(locale_parts): """ Return resource paths and stats for locales resources are available for. """ locale_c, locale_b, entityX = locale_parts project = entityX.resource.project resourceY = ResourceFactory.create( total_strings=1, project=project, path='/other/path.po', ) EntityFactory.create(resource=resourceY, string="Entity Y") TranslatedResourceFactory.create( resource=resourceY, locale=locale_c, ) TranslatedResourceFactory.create( resource=resourceY, locale=locale_b, ) # results are sorted by title detailsX = locale_c.parts_stats(project) assert ( [detail["title"] for detail in detailsX][:2] == sorted([entityX.resource.path, '/other/path.po']) ) assert detailsX[0]['unreviewed_strings'] == 0 assert detailsX[1]['unreviewed_strings'] == 0 detailsY = locale_b.parts_stats(project) assert len(detailsY) == 2 assert detailsY[0]['title'] == '/other/path.po' assert detailsY[0]['unreviewed_strings'] == 0
def test_locale_parts_stats_pages_tied_to_resources(locale_parts): """ Return subpage name and stats for locales resources are available for. """ locale_a, locale_b, entity_a = locale_parts project = entity_a.resource.project resourceX = ResourceFactory.create( project=project, path='/other/path.po', ) EntityFactory.create(resource=resourceX, string="Entity X") TranslatedResourceFactory.create( resource=resourceX, locale=locale_a, ) TranslatedResourceFactory.create( resource=resourceX, locale=locale_b, ) sub1 = SubpageFactory.create( project=project, name='Subpage', ) sub1.resources.add(resourceX) sub2 = SubpageFactory.create( project=project, name='Other Subpage', ) sub2.resources.add(resourceX) details0 = locale_a.parts_stats(project) detailsX = locale_b.parts_stats(project) assert details0[0]['title'] == 'Other Subpage' assert details0[0]['unreviewed_strings'] == 0 assert details0[1]['title'] == 'Subpage' assert details0[1]['unreviewed_strings'] == 0 assert detailsX[0]['title'] == 'Other Subpage' assert detailsX[0]['unreviewed_strings'] == 0
def test_mgr_entity_filter_warnings(resource_a, locale_a): entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i ) for i in range(0, 3) ] translations = [ TranslationFactory.create( locale=locale_a, entity=entities[i], fuzzy=True, ) for i in range(0, 3) ] WarningFactory.create( translation=translations[1] ) WarningFactory.create( translation=translations[2] ) TranslatedResource.objects.get( resource=translations[2].entity.resource, locale=translations[2].locale, ).calculate_stats() translations[2].fuzzy = False translations[2].save() assert ( set(Entity.objects.filter( Entity.objects.warnings(locale_a) )) == {entities[1]} )
def test_translation_save_latest_update_for_system_project( locale_a, system_project_a): """ When a translation is saved for a system project, update the latest_translation attribute on the project, translatedresource and project_locale objects, but not on the locale object. """ project_locale = ProjectLocaleFactory.create( project=system_project_a, locale=locale_a, ) resource = ResourceFactory.create( project=system_project_a, path="resource.po", format="po", ) tr = TranslatedResourceFactory.create(locale=locale_a, resource=resource) entity = EntityFactory.create(resource=resource, string="Entity X") assert locale_a.latest_translation is None assert system_project_a.latest_translation is None assert tr.latest_translation is None assert project_locale.latest_translation is None translation = TranslationFactory.create( locale=locale_a, entity=entity, date=aware_datetime(1970, 1, 1), ) for i in [locale_a, system_project_a, project_locale, tr]: i.refresh_from_db() assert locale_a.latest_translation is None assert system_project_a.latest_translation == translation assert tr.latest_translation == translation assert project_locale.latest_translation == translation
def test_entity_project_locale_filter(entity_test_models, locale_b, project_b): """ Evaluate entities filtering by locale, project, obsolete. """ tr0, tr0pl, trX, subpageX = entity_test_models locale_a = tr0.locale resource0 = tr0.entity.resource project_a = tr0.entity.resource.project EntityFactory.create( obsolete=True, resource=resource0, string='Obsolete String', ) assert len(Entity.for_project_locale(project_a, locale_b)) == 0 assert len(Entity.for_project_locale(project_b, locale_a)) == 0 assert len(Entity.for_project_locale(project_a, locale_a)) == 2
def test_mgr_entity_filter_unchanged(resource_a, locale_a): entities = [ EntityFactory.create( resource=resource_a, string="Unchanged string", ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], active=True, approved=True, string="Unchanged string", ) TranslationFactory.create( locale=locale_a, entity=entities[2], active=True, fuzzy=True, string="Unchanged string", ) TranslationFactory.create( locale=locale_a, entity=entities[1], active=False, approved=True, string="Unchanged string", ) assert set(Entity.objects.filter(Entity.objects.unchanged(locale_a))) == { entities[0], entities[2], }
def test_mgr_entity_filter_combined(resource_a, locale_a, user_a): """ All filters should be joined by AND instead of OR. Tests filters against bug introduced by bug 1243115. """ entities = [ EntityFactory.create(resource=resource_a, string="testentity%s" % i,) for i in range(0, 2) ] TranslationFactory.create( locale=locale_a, entity=entities[0], approved=True, user=user_a, ) TranslationFactory.create( locale=locale_a, entity=entities[1], fuzzy=True, user=user_a, ) assert ( list( Entity.for_project_locale( resource_a.project, locale_a, status="unreviewed", author=user_a.email, ) ) == [] ) assert ( list( Entity.for_project_locale( resource_a.project, locale_a, status="unreviewed", time="201001010100-205001010100", ) ) == [] )
def test_mgr_entity_filter_missing(resource_a, locale_a): entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[2], fuzzy=True, ) TranslationFactory.create( locale=locale_a, entity=entities[2], ) assert ( set(resource_a.entities.filter( Entity.objects.missing(locale_a) )) == {entities[1]} )
def test_mgr_entity_filter_missing_without_unreviewed(resource_a, locale_a): entities = [ EntityFactory.create(resource=resource_a, string="testentity%s" % i,) for i in range(0, 5) ] TranslationFactory.create( locale=locale_a, entity=entities[0], approved=False, fuzzy=False, rejected=True, ) TranslationFactory.create( locale=locale_a, entity=entities[0], approved=False, fuzzy=False, rejected=True, ) TranslationFactory.create( locale=locale_a, entity=entities[2], approved=True, fuzzy=False, rejected=False, ) TranslationFactory.create( locale=locale_a, entity=entities[3], approved=False, fuzzy=True, rejected=False, ) TranslationFactory.create( locale=locale_a, entity=entities[1], approved=False, fuzzy=False, rejected=True, ) TranslationFactory.create( locale=locale_a, entity=entities[1], approved=False, fuzzy=False, rejected=False, ) assert set( resource_a.entities.filter(Entity.objects.missing_without_unreviewed(locale_a)) ) == {entities[0], entities[4]}
def test_mgr_entity_filter_missing_plural(resource_a, locale_a): locale_a.cldr_plurals = "1,5" locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, string_plural="testpluralentity%s" % i, ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], fuzzy=True, plural_form=0, ) TranslationFactory.create( locale=locale_a, entity=entities[0], fuzzy=True, plural_form=1, ) TranslationFactory.create( locale=locale_a, entity=entities[2], approved=True, plural_form=0, ) TranslationFactory.create( locale=locale_a, entity=entities[2], approved=True, plural_form=1, ) assert set(resource_a.entities.filter(Entity.objects.missing(locale_a))) == { entities[1] }
def test_mgr_entity_filter_warnings_plural(resource_a, locale_a): locale_a.cldr_plurals = "1,5" locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, string_plural="testpluralentity%s" % i, ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=0, ) TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=1, fuzzy=True, ) translation20 = TranslationFactory.create( locale=locale_a, entity=entities[2], plural_form=0, fuzzy=True, ) TranslationFactory.create( locale=locale_a, entity=entities[2], plural_form=1, fuzzy=True, ) WarningFactory.create(translation=translation20) assert set(Entity.objects.filter(Entity.objects.warnings(locale_a))) == { entities[2] }
def test_mgr_bulk_update(get_word_count_mock, admin, resource_a, locale_a): """ Update entities method works and updates word_count field """ get_word_count_mock.return_value = 2 objs = [ EntityFactory.create( resource=resource_a, string="testentity %s" % i, ) for i in range(0, 2) ] assert get_word_count_mock.call_count == 2 testEntitiesQuerySet = Entity.for_project_locale(admin, resource_a.project, locale_a) testEntitiesQuerySet.bulk_update( objs, fields=[ "resource", "string", "string_plural", "key", "comment", "group_comment", "resource_comment", "order", "source", ], ) assert get_word_count_mock.call_count == 4
def test_mgr_entity_filter_rejected_plural(resource_a, locale_a): locale_a.cldr_plurals = '1,5' locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, string_plural="testpluralentity%s" % i, ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], approved=True, fuzzy=False, rejected=False, plural_form=0, ) TranslationFactory.create( locale=locale_a, entity=entities[0], approved=True, fuzzy=False, rejected=False, plural_form=1, ) TranslationFactory.create( locale=locale_a, entity=entities[1], approved=True, fuzzy=False, rejected=False, plural_form=0, ) TranslationFactory.create( locale=locale_a, entity=entities[1], approved=False, fuzzy=False, rejected=True, plural_form=1, ) TranslationFactory.create( locale=locale_a, entity=entities[2], approved=False, fuzzy=False, rejected=True, plural_form=0, ) TranslationFactory.create( locale=locale_a, entity=entities[2], approved=False, fuzzy=False, rejected=True, plural_form=1, ) assert (set(Entity.objects.filter( Entity.objects.rejected(locale_a))) == {entities[1], entities[2]})
def test_mgr_entity_filter_translated(resource_a, locale_a): entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[1], approved=False, ) TranslationFactory.create( locale=locale_a, entity=entities[2], approved=True, ) assert ( set(Entity.objects.filter( Entity.objects.translated(locale_a) )) == {entities[0], entities[2]} )
def test_mgr_entity_filter_unchanged(resource_a, locale_a): entities = [ EntityFactory.create( resource=resource_a, string='Unchanged string', ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], active=True, approved=True, string='Unchanged string', ) TranslationFactory.create( locale=locale_a, entity=entities[2], active=True, fuzzy=True, string='Unchanged string', ) TranslationFactory.create( locale=locale_a, entity=entities[1], active=False, approved=True, string='Unchanged string', ) assert ( set(Entity.objects.filter( Entity.objects.unchanged(locale_a) )) == {entities[0], entities[2]} )
def test_translation_save_latest_missing_project_locale(locale_a, project_a): """ If a translation is saved for a locale that isn't active on the project, do not fail due to a missing ProjectLocale. """ resource = ResourceFactory.create( project=project_a, path="resource.po", format="po", ) tr = TranslatedResourceFactory.create(locale=locale_a, resource=resource) entity = EntityFactory.create(resource=resource, string="Entity X") # This calls .save, this should fail if we're not properly # handling the missing ProjectLocale. translation = TranslationFactory.create( locale=locale_a, entity=entity, date=aware_datetime(1970, 1, 1), ) locale_a.refresh_from_db() project_a.refresh_from_db() tr.refresh_from_db() assert locale_a.latest_translation == translation assert project_a.latest_translation == translation assert tr.latest_translation == translation
def test_mgr_entity_filter_errors_plural(resource_a, locale_a): locale_a.cldr_plurals = "1,5" locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, string_plural="testpluralentity%s" % i, ) for i in range(0, 3) ] translation00 = TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=0, ) TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=1, approved=True, ) translation20 = TranslationFactory.create( locale=locale_a, entity=entities[2], plural_form=0, approved=True, ) translation21 = TranslationFactory.create( locale=locale_a, entity=entities[2], plural_form=1, approved=True, ) ErrorFactory.create(translation=translation00) ErrorFactory.create(translation=translation20) ErrorFactory.create(translation=translation21) assert set(Entity.objects.filter(Entity.objects.errors(locale_a))) == {entities[2]}
def test_reset_term_translation(locale_a): """ Test if TermTranslation gets properly updated when translation in the "Terminology" project changes. """ project, _ = Project.objects.get_or_create(slug="terminology") entity = EntityFactory.create(resource=project.resources.first()) term = TermFactory.create() entity.term = term # No approved Translations of an Entity: no TermTranslation TranslationFactory.create(locale=locale_a, entity=entity) entity.reset_term_translation(locale_a) assert entity.term.translations.filter(locale=locale_a).count() == 0 # First approved Translation of an Entity added: create TermTranslation to match the Translation translation_approved = TranslationFactory.create(locale=locale_a, entity=entity, approved=True) entity.reset_term_translation(locale_a) assert entity.term.translations.filter(locale=locale_a).count() == 1 assert (entity.term.translations.get( locale=locale_a).text == translation_approved.string) # Another approved Translation of an Entity added: update TermTranslation to match the Translation translation_approved_2 = TranslationFactory.create(locale=locale_a, entity=entity, approved=True) entity.reset_term_translation(locale_a) assert entity.term.translations.filter(locale=locale_a).count() == 1 assert (entity.term.translations.get( locale=locale_a).text == translation_approved_2.string)
def test_mgr_entity_filter_warnings(resource_a, locale_a): entities = [ EntityFactory.create(resource=resource_a, string="testentity%s" % i) for i in range(0, 3) ] translations = [ TranslationFactory.create( locale=locale_a, entity=entities[i], fuzzy=True, ) for i in range(0, 3) ] WarningFactory.create(translation=translations[1]) WarningFactory.create(translation=translations[2]) TranslatedResource.objects.get( resource=translations[2].entity.resource, locale=translations[2].locale, ).calculate_stats() translations[2].fuzzy = False translations[2].save() assert set(Entity.objects.filter( Entity.objects.warnings(locale_a))) == {entities[1]}
def test_mgr_entity_filter_partially_translated_plurals(resource_a, locale_a): locale_a.cldr_plurals = "1,5" locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="Unchanged string", string_plural="Unchanged plural string", ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=0, approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=1, approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[1], plural_form=0, approved=True, ) assert set(resource_a.entities.filter( Entity.objects.missing(locale_a))) == { entities[1], entities[2], }
def test_mgr_entity_filter_errors(resource_a, locale_a): entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i ) for i in range(0, 3) ] translations = [ TranslationFactory.create( locale=locale_a, entity=entities[i], approved=True, ) for i in range(0, 3) ] ErrorFactory.create( translation=translations[0] ) ErrorFactory.create( translation=translations[2] ) assert ( set(Entity.objects.filter( Entity.objects.errors(locale_a) )) == {entities[0], entities[2]} )
def test_mgr_entity_filter_unreviewed(resource_a, locale_a): entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[1], fuzzy=True, ) TranslationFactory.create( locale=locale_a, entity=entities[1], string="translation for 1", ) TranslationFactory.create( locale=locale_a, entity=entities[2], string="translation for 2", ) assert set(Entity.objects.filter(Entity.objects.unreviewed(locale_a))) == { entities[1], entities[2], }
def test_entity_project_locale_filter(entity_test_models, locale_b, project_b): """ Evaluate entities filtering by locale, project, obsolete. """ tr0, tr0pl, trX, subpageX = entity_test_models locale_a = tr0.locale resource0 = tr0.entity.resource project_a = tr0.entity.resource.project EntityFactory.create( obsolete=True, resource=resource0, string='Obsolete String', ) assert len(Entity.for_project_locale(project_a, locale_b)) == 0 assert len(Entity.for_project_locale(project_b, locale_a)) == 0 assert len(Entity.for_project_locale(project_a, locale_a)) == 2
def test_mgr_entity_filter_partially_translated_plurals(resource_a, locale_a): locale_a.cldr_plurals = '1,5' locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string='Unchanged string', string_plural='Unchanged plural string', ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=0, approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=1, approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[1], plural_form=0, approved=True, ) assert ( set(resource_a.entities.filter( Entity.objects.missing(locale_a) )) == {entities[1], entities[2]} )
def test_mgr_entity_filter_unreviewed(resource_a, locale_a): entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[1], fuzzy=True, ) TranslationFactory.create( locale=locale_a, entity=entities[1], string='translation for 1', ) TranslationFactory.create( locale=locale_a, entity=entities[2], string='translation for 2', ) assert ( set(Entity.objects.filter( Entity.objects.unreviewed(locale_a) )) == {entities[1], entities[2]} )
def test_pretranslate(gt_mock, project_a, locale_a, resource_a, locale_b): project_a.pretranslation_enabled = True project_a.save() resources = [ ResourceFactory(project=project_a, path=x, format="po") for x in ["resource_x.po", "resource_y.po"] ] for i, x in enumerate(["abaa", "abac"]): EntityFactory.create(resource=resources[0], string=x, order=i) for i, x in enumerate(["aaab", "abab"]): EntityFactory.create(resource=resources[1], string=x, order=i) TranslatedResourceFactory.create(resource=resources[0], locale=locale_a) TranslatedResourceFactory.create(resource=resources[0], locale=locale_b) TranslatedResourceFactory.create(resource=resources[1], locale=locale_a) ProjectLocaleFactory.create( project=project_a, locale=locale_a, pretranslation_enabled=True, ) ProjectLocaleFactory.create( project=project_a, locale=locale_b, pretranslation_enabled=True, ) tm_user = User.objects.get(email="*****@*****.**") gt_mock.return_value = [("pretranslation", None, tm_user)] pretranslate(project_a.pk) project_a.refresh_from_db() translations = Translation.objects.filter(user=tm_user) # Total pretranslations = 2(tr_ax) + 2(tr_bx) + 2(tr_ay) assert len(translations) == 6 # pretranslated count == total pretranslations. assert project_a.pretranslated_strings == 6 # latest_translation belongs to pretranslations. assert project_a.latest_translation in translations
def test_lookup_collation(resource_a, locale_a): """ Filter translations according to collation. """ entity = EntityFactory.create(resource=resource_a, string="string",) entity_args = [ {"string": u"First string", "comment": u"random Strıng"}, {"string": u"Second strİng", "comment": u"random string"}, {"string": u"Third Strıng", "comment": u"random strİng"}, ] entities = [ EntityFactory(resource=resource_a, string=x["string"], comment=x["comment"],) for x in entity_args ] translation_args = [ u"this is string", u"this is STRİNG", u"this is Strıng", u"this is StrInG", u"this is sTriNg", ] translations = [ TranslationFactory(entity=entity, locale=locale_a, string=s,) for s in translation_args ] # Check if 'Iı' and 'İi' are appropriately distinguished and filtered # according to turkish(tr_tr) collation assert set( resource_a.entities.filter(string__icontains_collate=(u"string", "tr_tr")) ) == set([entities[n] for n in [0, 1]] + [entity]) assert set( resource_a.entities.filter(comment__icontains_collate=(u"strİng", "tr_tr")) ) == set([entities[n] for n in [1, 2]]) assert set( Translation.objects.filter(string__icontains_collate=(u"string", "tr_tr")) ) == set([translations[n] for n in [0, 1, 4]]) assert set( Translation.objects.filter(string__icontains_collate=(u"string", "tr_tr")) ) == set([translations[n] for n in [0, 1, 4]]) assert set( Translation.objects.filter(string__icontains_collate=(u"strİng", "tr_tr")) ) == set([translations[n] for n in [0, 1, 4]]) assert set( Translation.objects.filter(string__icontains_collate=(u"strıng", "tr_tr")) ) == set([translations[n] for n in [2, 3]]) # Check if differentiation fails without any collation(C) assert set( Translation.objects.filter(string__icontains_collate=(u"string", "C")) ) == set([translations[n] for n in [0, 3, 4]]) # Compare the icontains_collate query with regular i_contains query assert list(Translation.objects.filter(string__icontains=u"string")) == [ translations[n] for n in [0, 2, 3, 4] ]
def locale_parts(project_b, locale_c, locale_b): ProjectLocaleFactory.create(project=project_b, locale=locale_c) ProjectLocaleFactory.create(project=project_b, locale=locale_b) resourceX = ResourceFactory.create( project=project_b, path="resourceX.po", format="po", ) entityX = EntityFactory.create(resource=resourceX, string="entityX") resourceX.total_strings = 1 resourceX.save() TranslatedResourceFactory.create(locale=locale_c, resource=resourceX) return locale_c, locale_b, entityX
def test_translation_in_terminology_saved(reset_term_translation_mock, locale_a): """ When translation in the "Terminology" project gets saved, call the reset_term_translation() method. """ project, _ = Project.objects.get_or_create(slug="terminology") entity = EntityFactory.create(resource=project.resources.first()) TranslationFactory.create(locale=locale_a, entity=entity) assert reset_term_translation_mock.called assert reset_term_translation_mock.call_args == call(locale_a)
def locale_parts(project_b, locale_c, locale_b): ProjectLocaleFactory.create(project=project_b, locale=locale_c) ProjectLocaleFactory.create(project=project_b, locale=locale_b) resourceX = ResourceFactory.create( project=project_b, path="resourceX.po", format="po", ) entityX = EntityFactory.create(resource=resourceX, string="entityX") resourceX.total_strings = 1 resourceX.save() TranslatedResourceFactory.create(locale=locale_c, resource=resourceX) return locale_c, locale_b, entityX
def test_mgr_entity_filter_errors_plural(resource_a, locale_a): locale_a.cldr_plurals = '1,5' locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, string_plural="testpluralentity%s" % i, ) for i in range(0, 3) ] translation00 = TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=0, ) TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=1, approved=True, ) translation20 = TranslationFactory.create( locale=locale_a, entity=entities[2], plural_form=0, approved=True, ) translation21 = TranslationFactory.create( locale=locale_a, entity=entities[2], plural_form=1, approved=True, ) ErrorFactory.create( translation=translation00 ) ErrorFactory.create( translation=translation20 ) ErrorFactory.create( translation=translation21 ) assert ( set(Entity.objects.filter( Entity.objects.errors(locale_a) )) == {entities[2]} )
def test_locale_parts_stats_pages_tied_to_resources(locale_parts): """ Return subpage name and stats for locales resources are available for. """ locale_a, locale_b, entity_a = locale_parts project = entity_a.resource.project resourceX = ResourceFactory.create( project=project, path='/other/path.po', ) EntityFactory.create(resource=resourceX, string="Entity X") TranslatedResourceFactory.create( resource=resourceX, locale=locale_a, ) TranslatedResourceFactory.create( resource=resourceX, locale=locale_b, ) sub1 = SubpageFactory.create( project=project, name='Subpage', ) sub1.resources.add(resourceX) sub2 = SubpageFactory.create( project=project, name='Other Subpage', ) sub2.resources.add(resourceX) details0 = locale_a.parts_stats(project) detailsX = locale_b.parts_stats(project) assert details0[0]['title'] == 'Other Subpage' assert details0[0]['unreviewed_strings'] == 0 assert details0[1]['title'] == 'Subpage' assert details0[1]['unreviewed_strings'] == 0 assert detailsX[0]['title'] == 'Other Subpage' assert detailsX[0]['unreviewed_strings'] == 0
def test_mgr_entity_filter_fuzzy_plurals(resource_a, locale_a): locale_a.cldr_plurals = '1,5' locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, string_plural="testpluralentity%s" % i, ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=0, fuzzy=True, ) TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=1, fuzzy=True, ) TranslationFactory.create( locale=locale_a, entity=entities[1], plural_form=0, fuzzy=True, ) TranslationFactory.create( locale=locale_a, entity=entities[2], plural_form=0, fuzzy=True, ) TranslationFactory.create( locale=locale_a, entity=entities[2], plural_form=1, fuzzy=True, ) assert ( set(Entity.objects.filter( Entity.objects.fuzzy(locale_a) )) == {entities[0], entities[2]} )
def test_mgr_entity_filter_pretranslated_plurals(resource_a, locale_a): locale_a.cldr_plurals = "1,5" locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, string_plural="testpluralentity%s" % i, ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=0, pretranslated=True, ) TranslationFactory.create( locale=locale_a, entity=entities[0], plural_form=1, pretranslated=True, ) TranslationFactory.create( locale=locale_a, entity=entities[1], plural_form=0, pretranslated=True, ) TranslationFactory.create( locale=locale_a, entity=entities[2], plural_form=0, pretranslated=True, ) TranslationFactory.create( locale=locale_a, entity=entities[2], plural_form=1, pretranslated=True, ) assert set(Entity.objects.filter( Entity.objects.pretranslated(locale_a))) == { entities[0], entities[2], }
def test_mgr_entity_filter_unreviewed_plural(resource_a, locale_a): locale_a.cldr_plurals = '1,5' locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, string_plural="testpluralentity%s" % i, ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], approved=False, fuzzy=False, plural_form=0, ) TranslationFactory.create( locale=locale_a, entity=entities[0], approved=False, fuzzy=False, plural_form=1, ) TranslationFactory.create( locale=locale_a, entity=entities[2], approved=False, fuzzy=False, plural_form=0, ) TranslationFactory.create( locale=locale_a, entity=entities[2], approved=False, fuzzy=False, plural_form=1, ) assert ( set(Entity.objects.filter( Entity.objects.unreviewed(locale_a) )) == {entities[0], entities[2]} )
def test_project_needs_sync(project_a, project_b, locale_a): """ Project.needs_sync should be True if ChangedEntityLocale objects exist for its entities or if Project has unsynced locales. """ resource = ResourceFactory.create(project=project_a, path="resourceX.po") entity = EntityFactory.create(resource=resource, string="entityX") assert not project_a.needs_sync ChangedEntityLocaleFactory.create(entity=entity, locale=locale_a) assert project_a.needs_sync assert not project_b.needs_sync assert project_b.unsynced_locales == [] del project_b.unsynced_locales ProjectLocaleFactory.create( project=project_b, locale=locale_a, ) assert project_b.needs_sync == [locale_a]
def test_project_needs_sync(project_a, project_b, locale_a): """ Project.needs_sync should be True if ChangedEntityLocale objects exist for its entities or if Project has unsynced locales. """ resource = ResourceFactory.create(project=project_a, path="resourceX.po") entity = EntityFactory.create(resource=resource, string="entityX") assert not project_a.needs_sync ChangedEntityLocaleFactory.create(entity=entity, locale=locale_a) assert project_a.needs_sync assert not project_b.needs_sync assert project_b.unsynced_locales == [] del project_b.unsynced_locales ProjectLocaleFactory.create( project=project_b, locale=locale_a, ) assert project_b.needs_sync == [locale_a]
def test_translation_unapproved_not_in_tm(locale_a, project_a): """ Unapproved translation shouldn't be in the translation memory. """ resource = ResourceFactory.create( project=project_a, path="resource.po", format="po", ) entity = EntityFactory.create(resource=resource, string="Entity X") translation = TranslationFactory.create( locale=locale_a, entity=entity, ) with pytest.raises(TranslationMemoryEntry.DoesNotExist): TranslationMemoryEntry.objects.get( source=translation.entity.string, target=translation.string, locale=translation.locale, )
def test_translation_unapproved_not_in_tm(locale_a, project_a): """ Unapproved translation shouldn't be in the translation memory. """ resource = ResourceFactory.create( project=project_a, path="resource.po", format="po", ) entity = EntityFactory.create(resource=resource, string="Entity X") translation = TranslationFactory.create( locale=locale_a, entity=entity, ) with pytest.raises(TranslationMemoryEntry.DoesNotExist): TranslationMemoryEntry.objects.get( source=translation.entity.string, target=translation.string, locale=translation.locale, )
def test_mgr_entity_filter_unchanged_plural(resource_a, locale_a): locale_a.cldr_plurals = '1,5' locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string='Unchanged string', string_plural='Unchanged plural string', ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], approved=True, plural_form=0, string='Unchanged string', ) TranslationFactory.create( locale=locale_a, entity=entities[0], approved=True, plural_form=1, string='Unchanged plural string', ) TranslationFactory.create( locale=locale_a, entity=entities[2], fuzzy=True, plural_form=0, string='Unchanged string', ) TranslationFactory.create( locale=locale_a, entity=entities[2], fuzzy=True, plural_form=1, string='Unchanged plural string', ) assert (set(Entity.objects.filter( Entity.objects.unchanged(locale_a))) == {entities[0], entities[2]})
def test_translation_approved_in_tm(locale_a, project_a): """ Every save of approved translation should generate a new entry in the translation memory. """ resource = ResourceFactory.create( project=project_a, path="resource.po", format="po", ) entity = EntityFactory.create(resource=resource, string="Entity X") translation = TranslationFactory.create( locale=locale_a, entity=entity, approved=True, ) assert TranslationMemoryEntry.objects.get( source=translation.entity.string, target=translation.string, locale=translation.locale, )
def test_translation_approved_in_tm(locale_a, project_a): """ Every save of approved translation should generate a new entry in the translation memory. """ resource = ResourceFactory.create( project=project_a, path="resource.po", format="po", ) entity = EntityFactory.create(resource=resource, string="Entity X") translation = TranslationFactory.create( locale=locale_a, entity=entity, approved=True, ) assert TranslationMemoryEntry.objects.get( source=translation.entity.string, target=translation.string, locale=translation.locale, )
def test_mgr_entity_filter_combined(resource_a, locale_a, user_a): """ All filters should be joined by AND instead of OR. Tests filters against bug introduced by bug 1243115. """ entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, ) for i in range(0, 2) ] TranslationFactory.create( locale=locale_a, entity=entities[0], approved=True, user=user_a, ) TranslationFactory.create( locale=locale_a, entity=entities[1], fuzzy=True, user=user_a, ) assert ( list(Entity.for_project_locale( resource_a.project, locale_a, status='unreviewed', author=user_a.email, )) == [] ) assert ( list(Entity.for_project_locale( resource_a.project, locale_a, status='unreviewed', time='201001010100-205001010100', )) == [] )
def test_translation_rejected_not_in_tm(locale_a, project_a): """ When translation is deleted, its corresponding TranslationMemoryEntry needs to be deleted, too. """ resource = ResourceFactory.create( project=project_a, path="resource.po", format="po", ) entity = EntityFactory.create(resource=resource, string="Entity X") translation = TranslationFactory.create( locale=locale_a, entity=entity, rejected=True, ) with pytest.raises(TranslationMemoryEntry.DoesNotExist): TranslationMemoryEntry.objects.get( source=translation.entity.string, target=translation.string, locale=translation.locale, )
def test_translation_rejected_not_in_tm(locale_a, project_a): """ When translation is deleted, its corresponding TranslationMemoryEntry needs to be deleted, too. """ resource = ResourceFactory.create( project=project_a, path="resource.po", format="po", ) entity = EntityFactory.create(resource=resource, string="Entity X") translation = TranslationFactory.create( locale=locale_a, entity=entity, rejected=True, ) with pytest.raises(TranslationMemoryEntry.DoesNotExist): TranslationMemoryEntry.objects.get( source=translation.entity.string, target=translation.string, locale=translation.locale, )
def test_translation_save_latest_update(locale_a, project_a): """ When a translation is saved, update the latest_translation attribute on the related project, locale, translatedresource, and project_locale objects. """ project_locale = ProjectLocaleFactory.create( project=project_a, locale=locale_a, ) resource = ResourceFactory.create( project=project_a, path="resource.po", format="po", ) tr = TranslatedResourceFactory.create(locale=locale_a, resource=resource) entity = EntityFactory.create(resource=resource, string="Entity X") assert locale_a.latest_translation is None assert project_a.latest_translation is None assert tr.latest_translation is None assert project_locale.latest_translation is None translation = TranslationFactory.create( locale=locale_a, entity=entity, date=aware_datetime(1970, 1, 1), ) locale_a.refresh_from_db() project_a.refresh_from_db() tr.refresh_from_db() project_locale.refresh_from_db() assert locale_a.latest_translation == translation assert project_a.latest_translation == translation assert tr.latest_translation == translation assert project_locale.latest_translation == translation # Ensure translation is replaced for newer translations newer_translation = TranslationFactory.create( locale=locale_a, entity=entity, date=aware_datetime(1970, 2, 1), ) locale_a.refresh_from_db() project_a.refresh_from_db() tr.refresh_from_db() project_locale.refresh_from_db() assert locale_a.latest_translation == newer_translation assert project_a.latest_translation == newer_translation assert tr.latest_translation == newer_translation assert project_locale.latest_translation == newer_translation # Ensure translation isn't replaced for older translations. TranslationFactory.create( locale=locale_a, entity=entity, date=aware_datetime(1970, 1, 5), ) locale_a.refresh_from_db() project_a.refresh_from_db() tr.refresh_from_db() project_locale.refresh_from_db() assert locale_a.latest_translation == newer_translation assert project_a.latest_translation == newer_translation assert tr.latest_translation == newer_translation assert project_locale.latest_translation == newer_translation # Ensure approved_date is taken into consideration as well. newer_approved_translation = TranslationFactory.create( locale=locale_a, entity=entity, approved_date=aware_datetime(1970, 3, 1), ) locale_a.refresh_from_db() project_a.refresh_from_db() tr.refresh_from_db() project_locale.refresh_from_db() assert locale_a.latest_translation == newer_approved_translation assert project_a.latest_translation == newer_approved_translation assert tr.latest_translation == newer_approved_translation assert project_locale.latest_translation == newer_approved_translation
def test_mgr_entity_filter_unchanged_plural(resource_a, locale_a): locale_a.cldr_plurals = '1,5' locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string='Unchanged string', string_plural='Unchanged plural string', ) for i in range(0, 3) ] TranslationFactory.create( locale=locale_a, entity=entities[0], active=True, approved=True, plural_form=0, string='Unchanged string', ) TranslationFactory.create( locale=locale_a, entity=entities[0], active=True, approved=True, plural_form=1, string='Unchanged plural string', ) TranslationFactory.create( locale=locale_a, entity=entities[1], active=False, fuzzy=True, plural_form=0, string='Unchanged string', ) TranslationFactory.create( locale=locale_a, entity=entities[1], active=False, fuzzy=True, plural_form=1, string='Unchanged plural string', ) TranslationFactory.create( locale=locale_a, entity=entities[2], active=True, fuzzy=True, plural_form=0, string='Unchanged string', ) TranslationFactory.create( locale=locale_a, entity=entities[2], active=True, fuzzy=True, plural_form=1, string='Unchanged plural string', ) assert ( set(Entity.objects.filter( Entity.objects.unchanged(locale_a) )) == {entities[0], entities[2]} )
def test_mgr_entity_reset_active_translations(resource_a, locale_a): locale_a.cldr_plurals = '1,5' locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, ) for i in range(0, 4) ] + [ EntityFactory( resource=resource_a, string='testentity4', string_plural='testentity4plural', ) ] entities_qs = Entity.objects.filter(pk__in=[e.pk for e in entities]) # Translations for Entity 0: # No translations pass # Translations for Entity 1: # 2 unreviewed translations TranslationFactory.create( locale=locale_a, entity=entities[1], string=entities[1].string + ' translation1', ) TranslationFactory.create( locale=locale_a, entity=entities[1], string=entities[1].string + ' translation2', ) # Translations for Entity 2: # Approved and unreviewed translation TranslationFactory.create( locale=locale_a, entity=entities[2], string=entities[2].string + ' translation1', approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[2], string=entities[2].string + ' translation2', ) # Translations for Entity 3: # Fuzzy and unreviewed translation TranslationFactory.create( locale=locale_a, entity=entities[3], string=entities[3].string + ' translation1', ) TranslationFactory.create( locale=locale_a, entity=entities[3], string=entities[3].string + ' translation2', fuzzy=True, ) # Translations for Entity 4 - pluralized: # Approved and unreviewed translation for first form, # a single unreviewed translation for second form TranslationFactory.create( locale=locale_a, entity=entities[4], plural_form=0, string=entities[4].string + ' translation1', approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[4], plural_form=0, string=entities[4].string + ' translation2', ) TranslationFactory.create( locale=locale_a, entity=entities[4], plural_form=1, string=entities[4].string_plural + ' translation1plural', ) entities_qs.reset_active_translations(locale=locale_a) # Active translations for Entity 0: # no active translations assert entities[0].translation_set.filter(active=True).count() == 0 # Active translations for Entity 1: # latest translation is active assert (entities[1].translation_set.get( active=True).string == entities[1].string + ' translation2') # Active translations for Entity 2: # approved translation is active assert (entities[2].translation_set.get( active=True).string == entities[2].string + ' translation1') # Active translations for Entity 3: # fuzzy translation is active assert (entities[3].translation_set.get( active=True).string == entities[3].string + ' translation2') # Active translations for Entity 4 - pluralized: # Approved translation for first form, # a single unreviewed translation for second form active = entities[4].translation_set.filter(active=True) assert active[0].string == entities[4].string + ' translation1' assert active[ 1].string == entities[4].string_plural + ' translation1plural'
def test_mgr_entity_reset_active_translations(resource_a, locale_a): locale_a.cldr_plurals = '1,5' locale_a.save() entities = [ EntityFactory.create( resource=resource_a, string="testentity%s" % i, ) for i in range(0, 4) ] + [ EntityFactory( resource=resource_a, string='testentity4', string_plural='testentity4plural', ) ] entities_qs = Entity.objects.filter(pk__in=[e.pk for e in entities]) # Translations for Entity 0: # No translations pass # Translations for Entity 1: # 2 unreviewed translations TranslationFactory.create( locale=locale_a, entity=entities[1], string=entities[1].string + ' translation1', ) TranslationFactory.create( locale=locale_a, entity=entities[1], string=entities[1].string + ' translation2', ) # Translations for Entity 2: # Approved and unreviewed translation TranslationFactory.create( locale=locale_a, entity=entities[2], string=entities[2].string + ' translation1', approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[2], string=entities[2].string + ' translation2', ) # Translations for Entity 3: # Fuzzy and unreviewed translation TranslationFactory.create( locale=locale_a, entity=entities[3], string=entities[3].string + ' translation1', ) TranslationFactory.create( locale=locale_a, entity=entities[3], string=entities[3].string + ' translation2', fuzzy=True, ) # Translations for Entity 4 - pluralized: # Approved and unreviewed translation for first form, # a single unreviewed translation for second form TranslationFactory.create( locale=locale_a, entity=entities[4], plural_form=0, string=entities[4].string + ' translation1', approved=True, ) TranslationFactory.create( locale=locale_a, entity=entities[4], plural_form=0, string=entities[4].string + ' translation2', ) TranslationFactory.create( locale=locale_a, entity=entities[4], plural_form=1, string=entities[4].string_plural + ' translation1plural', ) entities_qs.reset_active_translations(locale=locale_a) # Active translations for Entity 0: # no active translations assert entities[0].translation_set.filter(active=True).count() == 0 # Active translations for Entity 1: # latest translation is active assert ( entities[1].translation_set.get(active=True).string == entities[1].string + ' translation2' ) # Active translations for Entity 2: # approved translation is active assert ( entities[2].translation_set.get(active=True).string == entities[2].string + ' translation1' ) # Active translations for Entity 3: # fuzzy translation is active assert ( entities[3].translation_set.get(active=True).string == entities[3].string + ' translation2' ) # Active translations for Entity 4 - pluralized: # Approved translation for first form, # a single unreviewed translation for second form active = entities[4].translation_set.filter(active=True) assert active[0].string == entities[4].string + ' translation1' assert active[1].string == entities[4].string_plural + ' translation1plural'
def test_translation_save_latest_update(locale_a, project_a): """ When a translation is saved, update the latest_translation attribute on the related project, locale, translatedresource, and project_locale objects. """ project_locale = ProjectLocaleFactory.create( project=project_a, locale=locale_a, ) resource = ResourceFactory.create( project=project_a, path="resource.po", format="po", ) tr = TranslatedResourceFactory.create(locale=locale_a, resource=resource) entity = EntityFactory.create(resource=resource, string="Entity X") assert locale_a.latest_translation is None assert project_a.latest_translation is None assert tr.latest_translation is None assert project_locale.latest_translation is None translation = TranslationFactory.create( locale=locale_a, entity=entity, date=aware_datetime(1970, 1, 1), ) locale_a.refresh_from_db() project_a.refresh_from_db() tr.refresh_from_db() project_locale.refresh_from_db() assert locale_a.latest_translation == translation assert project_a.latest_translation == translation assert tr.latest_translation == translation assert project_locale.latest_translation == translation # Ensure translation is replaced for newer translations newer_translation = TranslationFactory.create( locale=locale_a, entity=entity, date=aware_datetime(1970, 2, 1), ) locale_a.refresh_from_db() project_a.refresh_from_db() tr.refresh_from_db() project_locale.refresh_from_db() assert locale_a.latest_translation == newer_translation assert project_a.latest_translation == newer_translation assert tr.latest_translation == newer_translation assert project_locale.latest_translation == newer_translation # Ensure translation isn't replaced for older translations. TranslationFactory.create( locale=locale_a, entity=entity, date=aware_datetime(1970, 1, 5), ) locale_a.refresh_from_db() project_a.refresh_from_db() tr.refresh_from_db() project_locale.refresh_from_db() assert locale_a.latest_translation == newer_translation assert project_a.latest_translation == newer_translation assert tr.latest_translation == newer_translation assert project_locale.latest_translation == newer_translation # Ensure approved_date is taken into consideration as well. newer_approved_translation = TranslationFactory.create( locale=locale_a, entity=entity, approved_date=aware_datetime(1970, 3, 1), ) locale_a.refresh_from_db() project_a.refresh_from_db() tr.refresh_from_db() project_locale.refresh_from_db() assert locale_a.latest_translation == newer_approved_translation assert project_a.latest_translation == newer_approved_translation assert tr.latest_translation == newer_approved_translation assert project_locale.latest_translation == newer_approved_translation
def test_lookup_collation(resource_a, locale_a): """ Filter translations according to collation. """ entity = EntityFactory.create( resource=resource_a, string="string", ) entity_args = [ { 'string': u'First string', 'comment': u'random Strıng', }, { 'string': u'Second strİng', 'comment': u'random string', }, { 'string': u'Third Strıng', 'comment': u'random strİng', }, ] entities = [ EntityFactory( resource=resource_a, string=x['string'], comment=x['comment'], ) for x in entity_args ] translation_args = [ u'this is string', u'this is STRİNG', u'this is Strıng', u'this is StrInG', u'this is sTriNg' ] translations = [ TranslationFactory( entity=entity, locale=locale_a, string=s, ) for s in translation_args ] # Check if 'Iı' and 'İi' are appropriately distinguished and filtered # according to turkish(tr_tr) collation assert ( set(resource_a.entities.filter( string__icontains_collate=(u'string', 'tr_tr') )) == set([entities[n] for n in [0, 1]] + [entity]) ) assert ( set(resource_a.entities.filter( comment__icontains_collate=(u'strİng', 'tr_tr') )) == set([entities[n] for n in [1, 2]]) ) assert ( set(Translation.objects.filter( string__icontains_collate=(u'string', 'tr_tr') )) == set([translations[n] for n in [0, 1, 4]]) ) assert ( set(Translation.objects.filter( string__icontains_collate=(u'string', 'tr_tr') )) == set([translations[n] for n in [0, 1, 4]]) ) assert ( set(Translation.objects.filter( string__icontains_collate=(u'strİng', 'tr_tr') )) == set([translations[n] for n in [0, 1, 4]]) ) assert ( set(Translation.objects.filter( string__icontains_collate=(u'strıng', 'tr_tr') )) == set([translations[n] for n in [2, 3]]) ) # Check if differentiation fails without any collation(C) assert ( set(Translation.objects.filter( string__icontains_collate=(u'string', 'C') )) == set([translations[n] for n in [0, 3, 4]]) ) # Compare the icontains_collate query with regular i_contains query assert ( list(Translation.objects.filter( string__icontains=u'string' )) == [translations[n] for n in [0, 2, 3, 4]] )