Skip to content

Commit 2f5c2a0

Browse files
Improve utests (#2943)
* Improve utests * Update utests. Keep coverage.xml
1 parent e7843e2 commit 2f5c2a0

File tree

12 files changed

+137
-10
lines changed

12 files changed

+137
-10
lines changed

.github/workflows/fedora_41.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ jobs:
9393
- uses: actions/upload-artifact@v4
9494
with:
9595
name: coverage-report
96-
path: .coverage-reports/htmlcov
96+
path: .coverage-reports/
9797
- name: Install and run
9898
run: |
9999
git submodule update --init --recursive

.github/workflows/linux.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ jobs:
128128
- uses: actions/upload-artifact@v4
129129
with:
130130
name: coverage-report
131-
path: .coverage-reports/htmlcov/
131+
path: .coverage-reports/
132132
- name: Install and run
133133
run: |
134134
git submodule update --init --recursive

pytest.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
[pytest]
22
addopts = -p no:warnings --order-group-scope=module
33
pythonpath = src src/robotide/preferences/configobj/src
4+

utest/application/test_editor_provider.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def test_registering(self):
3939
self.p.register_editor(TestObject, TestEditor2)
4040
assert self.p.get_editor(TestObject) == TestEditor2
4141

42-
def test_setting_deafult_editor(self):
42+
def test_setting_default_editor(self):
4343
self.p.register_editor(TestObject, TestEditor2, default=False)
4444
assert self.p.get_editor(TestObject) == TestEditor
4545

@@ -61,6 +61,11 @@ def test_registering_twice_does_nothing(self):
6161
self.p.register_editor(TestObject, TestEditor)
6262
assert self.p.get_editors(TestObject) == [TestEditor]
6363

64+
def test_set_default_last_does_nothing(self):
65+
self.p.register_editor(TestObject, TestEditor)
66+
self.p._editors[TestObject].set_default(TestEditor)
67+
assert self.p._editors[TestObject].get() == TestEditor
68+
6469
def test_activating(self):
6570
self.p.register_editor(TestObject, TestEditor2, default=False)
6671
self.p.set_active_editor(TestObject, TestEditor2)

utest/controller/test_commands.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import unittest
1919
from robotide.controller.tags import DefaultTag
2020
from robotide.controller.ctrlcommands import *
21+
from robotide.editor.formatters import ListToStringFormatter
2122

2223
# Workaround for relative import in non-module
2324
# see https://stackoverflow.com/questions/16981921/relative-imports-in-python-3
@@ -553,6 +554,11 @@ def test_commenting_and_uncommenting_row_with_no_step(self):
553554
self._exec(uncomment_rows([10001]))
554555
self._verify_number_of_test_changes(0)
555556

557+
def test_formatter(self):
558+
data = self._steps[self._data_row(FOR_LOOP_HEADER)]
559+
formatted = ListToStringFormatter(data).value
560+
assert formatted == "FOR | ${i} | IN | 1 | 2 | 3"
561+
556562

557563
_TEST_WITH_TWO_FOR_LOOPS = ['Test With Two For Loops',
558564
' FOR ${i} IN 1 2',

utest/controller/test_controllers.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
import os
1818
import sys
1919
import unittest
20+
from copy import deepcopy
21+
22+
import pytest
2023
from mockito import mock
2124
from robotide.robotapi import ALIAS_MARKER
2225

@@ -30,6 +33,7 @@
3033
from robotide.controller.tablecontrollers import (
3134
VariableTableController, MetadataListController, ImportSettingsController,
3235
WithListOperations)
36+
from robotide.controller.settingcontrollers import MetadataController
3337
from robotide.publish.messages import (
3438
RideImportSetting, RideImportSettingRemoved, RideImportSettingAdded,
3539
RideImportSettingChanged, RideItemSettingsChanged)
@@ -497,6 +501,33 @@ def test_editing(self):
497501
self._assert_var_in_ctrl(1, '@{listvar}', ['a', 'b', 'c'])
498502
assert self.ctrl.dirty
499503

504+
def test_index_difference(self):
505+
import operator
506+
self.ctrl.add_variable('${blaa}', 'value')
507+
names = [n for n in self.ctrl] # [n for n in self.ctrl]
508+
ordered = deepcopy(names)
509+
ordered = sorted(ordered, key=operator.attrgetter('name'))
510+
diff = self.ctrl._index_difference(names, ordered)
511+
print(f"DEBUG: test_controllers.py VariablesControllerTest test_index_difference diff={diff}")
512+
assert diff == [1, 2, 0]
513+
514+
def test_validate_name(self):
515+
first = self.ctrl.validate_dict_variable_name('%{boo}') # validate_name
516+
# print(f"DEBUG: test_controllers.py VariablesControllerTest test_validate_name first={first.error_message}")
517+
assert first.error_message == "Dictionary variable name must be in format &{name}"
518+
self._add_var('&{foo}', 'boo')
519+
second = self.ctrl.validate_dict_variable_name('&{foo}') # validate_name
520+
# print(f"DEBUG: test_controllers.py VariablesControllerTest test_validate_name first={second.error_message}")
521+
assert second.error_message == "Variable with this name already exists."
522+
523+
def test_delete_var(self):
524+
self._add_var('${boo}', 'boo')
525+
existing = [x.name for x in self.ctrl]
526+
assert existing == ['${foo}', '@{bar}', '${boo}']
527+
self.ctrl.delete(-1)
528+
existing = [x.name for x in self.ctrl]
529+
assert existing == ['${foo}', '@{bar}']
530+
500531
def _assert_var_in_ctrl(self, index, name, value):
501532
assert self.ctrl[index].name == name
502533
assert self.ctrl[index].value == value
@@ -525,6 +556,14 @@ def test_editing(self):
525556
def test_serialization(self):
526557
assert (self._get_metadata(0).as_list() == ['Metadata', 'Meta name', 'Some value'])
527558

559+
def test_iter_metadatalist(self):
560+
for item in self.ctrl:
561+
assert isinstance(item, MetadataController)
562+
563+
def test_add_metadata(self):
564+
self.ctrl.add_metadata('test_metadata', 'this is the value', 'this is the comment')
565+
self._assert_meta_in_model(-1, 'test_metadata', 'this is the value')
566+
528567
def _assert_meta_in_ctrl(self, index, name, value):
529568
assert self.ctrl[index].name == name
530569
assert self.ctrl[index].value == value
@@ -550,6 +589,13 @@ def _items(self):
550589
def mark_dirty(self):
551590
self.dirty = True
552591

592+
@property
593+
def original_items(self):
594+
return WithListOperations()._items
595+
596+
def original_mark_dirty(self):
597+
WithListOperations.mark_dirty(self)
598+
553599

554600
class WithListOperationsTest(unittest.TestCase):
555601

@@ -582,6 +628,16 @@ def test_delete(self):
582628
self._list_operations.delete(0)
583629
self._assert_item_in(0, 'bar')
584630

631+
def test_original_items(self):
632+
with pytest.raises(NotImplementedError):
633+
items = self._list_operations.original_items
634+
print(f"DEBUG: test_controllers WithListOperationsTests test_original_items items={items}")
635+
636+
def test_original_mark_dirty(self):
637+
with pytest.raises(NotImplementedError):
638+
self._list_operations.original_mark_dirty()
639+
print("DEBUG: test_controllers WithListOperationsTests test_original_mark_dirty")
640+
585641
def _assert_item_in(self, index, name):
586642
assert self._list_operations._items[index] == name
587643

utest/editor/test_z_kweditor_plugin.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,11 @@ def test_contentassist_file_button(self):
530530
wx.CallLater(5000, self.app.ExitMainLoop)
531531
self.app.MainLoop()
532532

533+
def test_get_resources(self):
534+
res = self.creator._only_resource_files(self.frame.tree)
535+
print(f"DEBUG: test_edit_creator.py EditorCreatorTest test_get_resources res={res}")
536+
537+
533538

534539
if __name__ == '__main__':
535540
unittest.main()

utest/namespace/test_namespace.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
TestCaseFile, Resource, VariableTable, TestDataDirectory)
88
from robotide.context import IS_WINDOWS
99
from robotide.namespace.namespace import _VariableStash
10+
from robotide.controller.basecontroller import WithNamespace
1011
from robotide.controller.filecontrollers import data_controller
1112
from robotide.spec.iteminfo import ArgumentInfo, VariableInfo
1213
from robotide.spec.librarymanager import LibraryManager
@@ -110,6 +111,12 @@ def tearDownClass(cls):
110111

111112
class TestKeywordSuggestions(_DataFileTest):
112113

114+
def test_get_cached_lib_names(self):
115+
project = WithNamespace()
116+
project._set_namespace(self.ns)
117+
lib_names = project.get_all_cached_library_names()
118+
assert lib_names == []
119+
113120
def test_getting_suggestions_for_empty_datafile(self):
114121
start = 'shOulD'
115122
# print("DEBUG: %s kw %s\n" % (start, self.kw.__doc__))

utest/namespace/test_resourcefactory.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def test_resourcefactory_ignores_imported_resource_from_ignore_directory(
6363

6464
def test_resourcefactory_ignores_imported_resource_from_ignore_subdirectory(self):
6565
self.r = self._create_factory(os.path.split(os.path.dirname(__file__))[0])
66-
self.assertEqual(None, self.r.get_resource_from_import(self._import, self._context))
66+
self.assertIsNone(self.r.get_resource_from_import(self._import, self._context))
6767

6868
def test_resourcefactory_finds_imported_resource_when_subdirectory_ignored(self):
6969
self.r = self._create_factory(os.path.join(os.path.dirname(__file__), 'something'))
@@ -77,7 +77,7 @@ def test_resourcefactory_finds_imported_resource_when_similar_ignore_name(self):
7777
def test_resourcefactory_ignores_imported_resource_when_relative_import(self):
7878
self.r = self._create_factory(os.path.abspath('.'))
7979
imp = ImportSetting(None, os.path.join('.', 'foo'))
80-
self.assertEqual(None, self.r.get_resource_from_import(imp, self._context))
80+
self.assertIsNone(self.r.get_resource_from_import(imp, self._context))
8181

8282
def test_resourcefactory_finds_imported_resource_from_python_path(self):
8383
self.r = _ResourceFactory(FakeSettings())
@@ -87,7 +87,14 @@ def test_resourcefactory_finds_imported_resource_from_python_path(self):
8787
def test_resourcefactory_ignores_imported_resource_from_python_path(self):
8888
self.r = self._create_factory(os.path.dirname(__file__))
8989
self.r.from_path = os.path.dirname(__file__)
90-
self.assertEqual(None, self.r.get_resource_from_import(self._import, self._context))
90+
self.assertIsNone(self.r.get_resource_from_import(self._import, self._context))
91+
92+
def test_resourcefactory_with_separator(self):
93+
self.r = self._create_factory(os.path.dirname(__file__))
94+
self.r.from_path = os.path.dirname(__file__)
95+
dir_name = self.r._with_separator(self.r.from_path)
96+
last_char = dir_name[-1]
97+
assert last_char == os.path.sep
9198

9299
if IS_WINDOWS:
93100

@@ -102,7 +109,7 @@ def test_case_insensitive_ignore_relative_with_pattern(self):
102109

103110
def _ignore_import(self, exclude_directory):
104111
self.r = self._create_factory(exclude_directory)
105-
self.assertEqual(None, self.r.get_resource_from_import(self._import, self._context))
112+
self.assertIsNone(self.r.get_resource_from_import(self._import, self._context))
106113

107114
def _create_factory(self, excluded_dir):
108115
settings = FakeSettings()
@@ -120,7 +127,7 @@ def _mock_context(self):
120127

121128
def _is_resolved(self, factory, imp=None):
122129
imp = imp or self._import
123-
self.assertNotEqual(None, factory.get_resource_from_import(imp, self._context))
130+
self.assertIsNotNone(factory.get_resource_from_import(imp, self._context))
124131

125132

126133
if __name__ == '__main__':

utest/publish/test_message_publishing.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from robotide.publish.messages import (RideMessage, RideLogMessage,
2020
RideLogException)
2121
from robotide.publish.publisher import PUBLISHER
22+
from robotide.publish import get_html_message
2223

2324

2425
class RideTestMessage(RideMessage):
@@ -53,6 +54,10 @@ class RideNoneTopicTestMessage(RideTestMessage):
5354

5455
class TestMessage(unittest.TestCase):
5556

57+
def test_no_robot_message(self):
58+
message = get_html_message('no_robot')
59+
assert 'Robot Framework installation not found!' in message
60+
5661
def test_topic(self):
5762
assert RideMessage.topic() == 'ride'
5863
assert RideTestMessage.topic() == 'my.topic'

0 commit comments

Comments
 (0)