diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 00000000000..83361e5e1d7 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,13 @@ +[run] +omit = + # Omit all migration files + */migrations/* + specifyweb/specify/temp_models.py + */tests/* + specifyweb/settings.py + specifyweb/specify/selenium_tests.py + specifyweb/specify/sp7_build_models.py + specifyweb/specify/geo_time.py + */management/* + specifyweb/stored_queries/sp7_build_models.py + specifyweb/accounts/views.py \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7f661d6ff35..c507a11e909 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -140,7 +140,12 @@ jobs: # mysql -h 127.0.0.1 -P $PORT -u MasterUser -p'MasterPassword' -e 'DROP DATABASE IF EXISTS test_SpecifyDB;'; # mysql -h 127.0.0.1 -P $PORT -u MasterUser -p'MasterPassword' -e 'SHOW DATABASES;' - name: Run test suite - run: ./ve/bin/python manage.py test --verbosity=3 --keepdb + run: | + cat .coveragerc + set +e + ./ve/bin/coverage run --source='./specifyweb/' manage.py test specifyweb --verbosity=3 --keepdb + set -e + ./ve/bin/coverage report # run: ./ve/bin/python manage.py test --verbosity=3 --noinput test-front-end: diff --git a/requirements-testing.txt b/requirements-testing.txt index 21bba85648c..61eb451fd21 100644 --- a/requirements-testing.txt +++ b/requirements-testing.txt @@ -3,4 +3,5 @@ mypy==1.5.1 hypothesis>=6.131.9,<7 hypothesis-jsonschema==0.19.0 types-requests==2.28.5 -lxml \ No newline at end of file +lxml +coverage diff --git a/specifyweb/frontend/js_src/lib/localization/report.ts b/specifyweb/frontend/js_src/lib/localization/report.ts index f60ef335f0d..cc99006380e 100644 --- a/specifyweb/frontend/js_src/lib/localization/report.ts +++ b/specifyweb/frontend/js_src/lib/localization/report.ts @@ -4,184 +4,184 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const reportsText = createDictionary({ label: { - "en-us": "Label", - "ru-ru": "Этикетка", - "es-es": "Etiqueta", - "fr-fr": "Étiquette", - "uk-ua": "Етикетка", - "de-ch": "Etikett", - "pt-br": "Rótulo", + 'en-us': 'Label', + 'ru-ru': 'Этикетка', + 'es-es': 'Etiqueta', + 'fr-fr': 'Étiquette', + 'uk-ua': 'Етикетка', + 'de-ch': 'Etikett', + 'pt-br': 'Rótulo', }, labels: { - "en-us": "Labels", - "ru-ru": "Этикетки", - "es-es": "Etiquetas", - "fr-fr": "Étiquettes", - "uk-ua": "Етикетки", - "de-ch": "Etiketten", - "pt-br": "Etiquetas", + 'en-us': 'Labels', + 'ru-ru': 'Этикетки', + 'es-es': 'Etiquetas', + 'fr-fr': 'Étiquettes', + 'uk-ua': 'Етикетки', + 'de-ch': 'Etiketten', + 'pt-br': 'Etiquetas', }, report: { - "en-us": "Report", - "ru-ru": "Отчет", - "es-es": "Informe", - "fr-fr": "Rapport", - "uk-ua": "Звіт", - "de-ch": "Auswertung", - "pt-br": "Relatório", + 'en-us': 'Report', + 'ru-ru': 'Отчет', + 'es-es': 'Informe', + 'fr-fr': 'Rapport', + 'uk-ua': 'Звіт', + 'de-ch': 'Auswertung', + 'pt-br': 'Relatório', }, reports: { - "en-us": "Reports", - "ru-ru": "Отчеты", - "es-es": "Informes", - "fr-fr": "Rapports", - "uk-ua": "Звіти", - "de-ch": "Berichte", - "pt-br": "Relatórios", + 'en-us': 'Reports', + 'ru-ru': 'Отчеты', + 'es-es': 'Informes', + 'fr-fr': 'Rapports', + 'uk-ua': 'Звіти', + 'de-ch': 'Berichte', + 'pt-br': 'Relatórios', }, reportProblems: { - "en-us": "Problems with report", - "ru-ru": "Проблемы с отчетом", - "es-es": "Problemas con el informe", - "fr-fr": "Problèmes avec le rapport", - "uk-ua": "Проблеми зі звітом", - "de-ch": "Probleme mit Bericht", - "pt-br": "Problemas com o relatório", + 'en-us': 'Problems with report', + 'ru-ru': 'Проблемы с отчетом', + 'es-es': 'Problemas con el informe', + 'fr-fr': 'Problèmes avec le rapport', + 'uk-ua': 'Проблеми зі звітом', + 'de-ch': 'Probleme mit Bericht', + 'pt-br': 'Problemas com o relatório', }, reportProblemsDescription: { - "en-us": "The selected report has the following problems:", - "ru-ru": "В выбранном отчете есть следующие проблемы:", - "es-es": "El informe seleccionado tiene los siguientes problemas:", - "fr-fr": "Le rapport sélectionné présente les problèmes suivants :", - "uk-ua": "Вибраний звіт має такі проблеми:", - "de-ch": "Der ausgewählte Bericht hat folgende Probleme:", - "pt-br": "O relatório selecionado apresenta os seguintes problemas:", + 'en-us': 'The selected report has the following problems:', + 'ru-ru': 'В выбранном отчете есть следующие проблемы:', + 'es-es': 'El informe seleccionado tiene los siguientes problemas:', + 'fr-fr': 'Le rapport sélectionné présente les problèmes suivants :', + 'uk-ua': 'Вибраний звіт має такі проблеми:', + 'de-ch': 'Der ausgewählte Bericht hat folgende Probleme:', + 'pt-br': 'O relatório selecionado apresenta os seguintes problemas:', }, missingAttachments: { - "en-us": "Missing attachments", - "ru-ru": "Отсутствующие вложения", - "es-es": "Adjuntos ausentes", - "fr-fr": "Pièces jointes manquantes", - "uk-ua": "Відсутні вкладення", - "de-ch": "Fehlende Anhänge", - "pt-br": "Anexos ausentes", + 'en-us': 'Missing attachments', + 'ru-ru': 'Отсутствующие вложения', + 'es-es': 'Adjuntos ausentes', + 'fr-fr': 'Pièces jointes manquantes', + 'uk-ua': 'Відсутні вкладення', + 'de-ch': 'Fehlende Anhänge', + 'pt-br': 'Anexos ausentes', }, fix: { - "en-us": "Fix", - "ru-ru": "Исправить", - "es-es": "Reparar", - "fr-fr": "Corriger", - "uk-ua": "Виправити", - "de-ch": "Korrektur", - "pt-br": "Consertar", + 'en-us': 'Fix', + 'ru-ru': 'Исправить', + 'es-es': 'Reparar', + 'fr-fr': 'Corriger', + 'uk-ua': 'Виправити', + 'de-ch': 'Korrektur', + 'pt-br': 'Consertar', }, chooseFile: { - "en-us": "Choose file", - "ru-ru": "Выберите файл", - "es-es": "Elejir archivo", - "fr-fr": "Sélectionner un fichier", - "uk-ua": "Виберіть файл", - "de-ch": "Datei auswählen", - "pt-br": "Escolha o arquivo", + 'en-us': 'Choose file', + 'ru-ru': 'Выберите файл', + 'es-es': 'Elejir archivo', + 'fr-fr': 'Sélectionner un fichier', + 'uk-ua': 'Виберіть файл', + 'de-ch': 'Datei auswählen', + 'pt-br': 'Escolha o arquivo', }, reportParameters: { - "en-us": "Report Parameters", - "ru-ru": "Параметры отчета", - "es-es": "Parámetros del informe", - "fr-fr": "Paramètres du rapport", - "uk-ua": "Параметри звіту", - "de-ch": "Parameter des Berichts", - "pt-br": "Parâmetros do relatório", + 'en-us': 'Report Parameters', + 'ru-ru': 'Параметры отчета', + 'es-es': 'Parámetros del informe', + 'fr-fr': 'Paramètres du rapport', + 'uk-ua': 'Параметри звіту', + 'de-ch': 'Parameter des Berichts', + 'pt-br': 'Parâmetros do relatório', }, runReport: { - "en-us": "Run Report", - "ru-ru": "Запустить репорт", - "es-es": "Ejecutar el Informe", - "fr-fr": "Effectuer le rapport", - "uk-ua": "Запустити звіт", - "de-ch": "Bericht ausführen", - "pt-br": "Relatório de execução", + 'en-us': 'Run Report', + 'ru-ru': 'Запустить репорт', + 'es-es': 'Ejecutar el Informe', + 'fr-fr': 'Effectuer le rapport', + 'uk-ua': 'Запустити звіт', + 'de-ch': 'Bericht ausführen', + 'pt-br': 'Relatório de execução', }, missingReportQuery: { - "en-us": "Missing Report Query", - "ru-ru": "Отсутствует запрос отчета", - "es-es": "Consulta de informe ausente", - "fr-fr": "Requête de rapport manquante", - "uk-ua": "Відсутній запит звіту", - "de-ch": "Fehlende Berichtsabfrage", - "pt-br": "Consulta de relatório ausente", + 'en-us': 'Missing Report Query', + 'ru-ru': 'Отсутствует запрос отчета', + 'es-es': 'Consulta de informe ausente', + 'fr-fr': 'Requête de rapport manquante', + 'uk-ua': 'Відсутній запит звіту', + 'de-ch': 'Fehlende Berichtsabfrage', + 'pt-br': 'Consulta de relatório ausente', }, missingReportQueryDescription: { - "en-us": "This report does not have an associated query", - "ru-ru": "Этот отчет не имеет связанного запроса", - "es-es": "Este informe no tiene una consulta asociada", - "fr-fr": "Ce rapport n'a pas de requête associée", - "uk-ua": "Цей звіт не має прив’язаного запиту", - "de-ch": "Dieser Bericht hat keine zugehörige Abfrage", - "pt-br": "Este relatório não possui uma consulta associada", + 'en-us': 'This report does not have an associated query', + 'ru-ru': 'Этот отчет не имеет связанного запроса', + 'es-es': 'Este informe no tiene una consulta asociada', + 'fr-fr': "Ce rapport n'a pas de requête associée", + 'uk-ua': 'Цей звіт не має прив’язаного запиту', + 'de-ch': 'Dieser Bericht hat keine zugehörige Abfrage', + 'pt-br': 'Este relatório não possui uma consulta associada', }, missingReport: { - "en-us": "Missing report", - "ru-ru": "Отсутствует отчет", - "es-es": "Informe ausente", - "fr-fr": "Rapport manquant", - "uk-ua": "Відсутній звіт", - "de-ch": "Fehlender Bericht", - "pt-br": "Relatório ausente", + 'en-us': 'Missing report', + 'ru-ru': 'Отсутствует отчет', + 'es-es': 'Informe ausente', + 'fr-fr': 'Rapport manquant', + 'uk-ua': 'Відсутній звіт', + 'de-ch': 'Fehlender Bericht', + 'pt-br': 'Relatório ausente', }, missingReportDescription: { - "en-us": "Unable to find an SpReport record for this App Resource", - "ru-ru": "Не удалось найти запись SpReport для этого ресурса приложения", - "es-es": - "No se puede encontrar un registro SpReport para este recurso de aplicación", - "fr-fr": + 'en-us': 'Unable to find an SpReport record for this App Resource', + 'ru-ru': 'Не удалось найти запись SpReport для этого ресурса приложения', + 'es-es': + 'No se puede encontrar un registro SpReport para este recurso de aplicación', + 'fr-fr': "Impossible de trouver un enregistrement SpReport pour cette ressource d'application", - "uk-ua": - "Не вдалося знайти запис таблиці SpReport для цього ресурсу програми", - "de-ch": "Es kann kein SpReport für diese App-Ressource gefunden werden", - "pt-br": - "Não é possível encontrar um registro SpReport para este recurso de aplicativo", + 'uk-ua': + 'Не вдалося знайти запис таблиці SpReport для цього ресурсу програми', + 'de-ch': 'Es kann kein SpReport für diese App-Ressource gefunden werden', + 'pt-br': + 'Não é possível encontrar um registro SpReport para este recurso de aplicativo', }, generateLabel: { - "en-us": "Generate label", - "ru-ru": "Сгенерировать метку", - "es-es": "Generar etiqueta", - "fr-fr": "Générer une étiquette", - "uk-ua": "Створити етикетку", - "de-ch": "Etikett generieren", - "pt-br": "Gerar rótulo", + 'en-us': 'Generate label', + 'ru-ru': 'Сгенерировать метку', + 'es-es': 'Generar etiqueta', + 'fr-fr': 'Générer une étiquette', + 'uk-ua': 'Створити етикетку', + 'de-ch': 'Etikett generieren', + 'pt-br': 'Gerar rótulo', }, generateLabelOnSave: { - "en-us": "Generate label on save", - "ru-ru": "Генерировать метку при сохранении", - "es-es": "Generar etiqueta al guardar", - "fr-fr": "Générer une étiquette lors de l'enregistrement", - "uk-ua": "Створити етикетку під час збереження", - "de-ch": "Etikett beim Speichern generieren", - "pt-br": "Gerar rótulo ao salvar", + 'en-us': 'Generate label on save', + 'ru-ru': 'Генерировать метку при сохранении', + 'es-es': 'Generar etiqueta al guardar', + 'fr-fr': "Générer une étiquette lors de l'enregistrement", + 'uk-ua': 'Створити етикетку під час збереження', + 'de-ch': 'Etikett beim Speichern generieren', + 'pt-br': 'Gerar rótulo ao salvar', }, generateReport: { - "en-us": "Generate report", - "ru-ru": "Сгенерировать отчет", - "es-es": "Generar informe", - "fr-fr": "Générer un rapport", - "uk-ua": "Створити звіт", - "de-ch": "Bericht generieren", - "pt-br": "Gerar relatório", + 'en-us': 'Generate report', + 'ru-ru': 'Сгенерировать отчет', + 'es-es': 'Generar informe', + 'fr-fr': 'Générer un rapport', + 'uk-ua': 'Створити звіт', + 'de-ch': 'Bericht generieren', + 'pt-br': 'Gerar relatório', }, generateReportOnSave: { - "en-us": "Generate report on save", - "ru-ru": "Генерировать отчет при сохранении", - "es-es": "Generar informe al guardar", - "fr-fr": "Générer un rapport lors de l'enregistrement", - "uk-ua": "Створити звіт при збереженні", - "de-ch": "Bericht beim Speichern generieren", - "pt-br": "Gerar relatório ao salvar", + 'en-us': 'Generate report on save', + 'ru-ru': 'Генерировать отчет при сохранении', + 'es-es': 'Generar informe al guardar', + 'fr-fr': "Générer un rapport lors de l'enregistrement", + 'uk-ua': 'Створити звіт при збереженні', + 'de-ch': 'Bericht beim Speichern generieren', + 'pt-br': 'Gerar relatório ao salvar', }, } as const); diff --git a/specifyweb/specify/test_load_datamodel.py b/specifyweb/specify/test_load_datamodel.py index 49e18bc02fe..7ed55a88b76 100644 --- a/specifyweb/specify/test_load_datamodel.py +++ b/specifyweb/specify/test_load_datamodel.py @@ -15,7 +15,7 @@ class DatamodelTests(TestCase): def setUp(self): self.sp6_datamodel = load_datamodel() - def test_specify_gen_models_code(self): + def test_specify_gen_models_code(self): # pragma: no cover if self.sp6_datamodel is None: return model_code = generate_build_model_imports_code() @@ -27,13 +27,13 @@ def test_specify_gen_models_code(self): # with open('./specifyweb/specify/specify_models.py', 'w') as f: # f.write(model_code) - def test_specify_gen_datamodel_code(self): + def test_specify_gen_datamodel_code(self): # pragma: no cover datamodel_code = build_datamodel_code_from_xml() # Uncomment this code if you want to generate the datamodel code # with open('./specifyweb/specify/specify_datamodel.py', 'w') as f: # f.write(datamodel_code) - def test_specify_gen_sqlalchemy_table_classes_code(self): + def test_specify_gen_sqlalchemy_table_classes_code(self): # pragma: no cover datamodel = sp7_datamodel if self.sp6_datamodel is not None: datamodel = self.sp6_datamodel @@ -43,7 +43,7 @@ def test_specify_gen_sqlalchemy_table_classes_code(self): # f.write(sqlalchemy_code) @skip("This test is not needed anymore as the datamodel has changed from sp6") - def test_datamodel_equivalence(self): + def test_datamodel_equivalence(self): # pragma: no cover # sp7_datamodel = build_datamodel_code_from_xml() # sp6_datamodel = load_datamodel() if self.sp6_datamodel is None: @@ -131,7 +131,7 @@ def test(self): 'test_attachments_field_dependent_in_' + table.name, make_attachments_field_dependent_test(table)) -def compare_models(dynamic_model, static_model): +def compare_models(dynamic_model, static_model): # pragma: no cover # Compare fields dynamic_fields = {f.name: f for f in dynamic_model._meta.get_fields()} static_fields = {f.name: f for f in static_model._meta.get_fields()}