Coverage for tests/test_common.py: 100%

65 statements  

« prev     ^ index     » next       coverage.py v7.16.2, created at 2026-10-16 22:05 +0000

1import datetime 

2 

3import pytest 

4 

5from bbconf.config_parser.bedbaseconfig import BedBaseConfig 

6from bbconf.config_parser.models import ConfigDB, ConfigFile, ConfigPath, ConfigServer 

7from bbconf.const import DEFAULT_LICENSE 

8from bbconf.exceptions import BadAccessMethodError 

9from bbconf.models.base_models import UsageModel 

10 

11from .conftest import SERVICE_UNAVAILABLE 

12from .utils import BED_TEST_ID, BEDSET_TEST_ID, ContextManagerDBTesting 

13 

14 

15def _bbconfig_without_access_methods() -> BedBaseConfig: 

16 """Build a BedBaseConfig with no DB/qdrant/ML setup, just a config file.""" 

17 bbconfig = object.__new__(BedBaseConfig) 

18 bbconfig._config = ConfigFile( 

19 database=ConfigDB(host="localhost", user="postgres", password="docker"), 

20 server=ConfigServer(), 

21 path=ConfigPath(), 

22 access_methods=None, 

23 ) 

24 return bbconfig 

25 

26 

27class TestAccessMethodsMissing: 

28 """access_methods is optional in the config; these should not raise AttributeError.""" 

29 

30 def test_construct_access_method_list_returns_empty(self): 

31 bbconfig = _bbconfig_without_access_methods() 

32 assert bbconfig.config.access_methods is None 

33 assert bbconfig.construct_access_method_list("some/rel/path") == [] 

34 

35 def test_get_prefixed_uri_raises_bad_access_method_error(self): 

36 bbconfig = _bbconfig_without_access_methods() 

37 with pytest.raises(BadAccessMethodError): 

38 bbconfig.get_prefixed_uri("some/rel/path", "http") 

39 

40 

41@pytest.mark.skipif(SERVICE_UNAVAILABLE, reason="Database is not available") 

42def test_get_stats(bbagent_obj): 

43 with ContextManagerDBTesting(config=bbagent_obj.config, add_data=True, bedset=True): 

44 return_result = bbagent_obj.get_stats() 

45 

46 assert return_result 

47 assert return_result.bedfiles_number == 1 

48 assert return_result.bedsets_number == 1 

49 assert return_result.genomes_number == 1 

50 

51 

52@pytest.mark.skipif(SERVICE_UNAVAILABLE, reason="Database is not available") 

53def test_get_detailed_stats(bbagent_obj): 

54 with ContextManagerDBTesting(config=bbagent_obj.config, add_data=True, bedset=True): 

55 return_result = bbagent_obj.get_detailed_stats() 

56 

57 assert return_result 

58 assert return_result.number_of_regions.mean == 1 

59 assert return_result.mean_region_width.mean == 3 

60 

61 

62@pytest.mark.skipif(SERVICE_UNAVAILABLE, reason="Database is not available") 

63def test_get_licenses(bbagent_obj): 

64 return_result = bbagent_obj.list_of_licenses 

65 

66 assert return_result 

67 assert DEFAULT_LICENSE in return_result 

68 

69 

70@pytest.mark.skipif(SERVICE_UNAVAILABLE, reason="Database is not available") 

71class TestAddUsage: 

72 def test_add_usages(self, bbagent_obj): 

73 usage = UsageModel( 

74 bed_meta={BED_TEST_ID: 3}, 

75 bedset_meta={BEDSET_TEST_ID: 4}, 

76 bed_search={"ff": 2}, 

77 bedset_search={"ase": 1}, 

78 files={"bin.bed.gz": 432}, 

79 date_from=datetime.datetime.now(), 

80 date_to=datetime.datetime.now(), 

81 ) 

82 

83 with ContextManagerDBTesting( 

84 config=bbagent_obj.config, add_data=True, bedset=True 

85 ): 

86 bbagent_obj.add_usage(usage) 

87 

88 def test_get_usage(self, bbagent_obj): 

89 now = datetime.datetime.now() 

90 usage = UsageModel( 

91 bed_meta={BED_TEST_ID: 3}, 

92 bedset_meta={}, 

93 bed_search={"ff": 2, "": 9}, 

94 bedset_search={"ase": 1}, 

95 files={"files/a/abc.bed.gz": 5}, 

96 date_from=now, 

97 date_to=now, 

98 ) 

99 

100 with ContextManagerDBTesting( 

101 config=bbagent_obj.config, add_data=True, bedset=True 

102 ): 

103 bbagent_obj.add_usage(usage) 

104 

105 bed = bbagent_obj.get_usage("bed_meta") 

106 assert [(r.key, r.count) for r in bed.results] == [(BED_TEST_ID, 3)] 

107 # empty search keys are dropped; search type is filtered 

108 search = bbagent_obj.get_usage("bed_search") 

109 assert [r.key for r in search.results] == ["ff"] 

110 # file paths are shortened to the bed id 

111 assert bbagent_obj.get_usage("files").results[0].key == "abc" 

112 # date range excludes rows outside the window 

113 later = now + datetime.timedelta(days=1) 

114 assert bbagent_obj.get_usage("bed_meta", date_from=later).count == 0 

115 assert bbagent_obj.get_usage("bed_meta", offset=1).count == 0 

116 

117 with pytest.raises(ValueError): 

118 bbagent_obj.get_usage("nope") 

119 with pytest.raises(ValueError): 

120 bbagent_obj.get_usage("bed_meta", limit=0)