Converting flags to a dict. Using test_async_client wherever tests required it.

This commit is contained in:
Roland 2024-05-08 17:31:15 -06:00
parent 63381c1d77
commit cd00df5c13
No known key found for this signature in database
GPG key ID: 9D6DBD3ACF11AB93
9 changed files with 51 additions and 53 deletions

View file

@ -28,20 +28,23 @@ import {useWROLMode} from "./hooks/customHooks";
import {FileSearchFilterButton} from "./components/Files";
import {DateSelectorButton} from "./components/DatesSelector";
function FlagsMessages({flags}) {
function FlagsMessages() {
const {settings, fetchSettings} = React.useContext(SettingsContext);
const {status} = useContext(StatusContext);
if (!flags) {
if (!status || !'flags' in status || _.isEmpty(status['flags'])) {
return <></>
}
const flags = status['flags'];
let refreshing;
let refreshRequired;
let dbDown;
let kiwixRestart;
// Do not tell the maintainer to refresh the files if they are already refreshing.
if (flags.indexOf('refreshing') >= 0) {
if (flags['refreshing']) {
// Actively refreshing.
refreshing = <Message icon>
<Icon name='circle notched' loading/>
@ -50,7 +53,7 @@ function FlagsMessages({flags}) {
<p><Link to='/files'>Click here to view the progress</Link></p>
</Message.Content>
</Message>;
} else if (flags.indexOf('refresh_complete') === -1) {
} else if (!flags['refresh_complete']) {
// `refresh_complete` flag is not set. Tell the maintainer to refresh the files.
refreshRequired = <Message icon warning onClick={refreshFiles}>
<Icon name='hand point right'/>
@ -61,11 +64,11 @@ function FlagsMessages({flags}) {
</Message>;
}
if (flags.indexOf('kiwix_restart') >= 0) {
if (flags['kiwix_restart']) {
kiwixRestart = <KiwixRestartMessage/>;
}
if (flags.indexOf('db_up') === -1) {
if (!flags['db_up']) {
dbDown = <Message icon error>
<Icon name='exclamation'/>
<Message.Content>
@ -78,7 +81,7 @@ function FlagsMessages({flags}) {
return <>
{refreshing}
{dbDown || refreshRequired}
{settings && settings['ignore_outdated_zims'] === false && flags.indexOf('outdated_zims') >= 0 ?
{settings && settings['ignore_outdated_zims'] === false && flags['outdated_zims'] ?
<OutdatedZimsMessage onClick={fetchSettings}/> : null}
{kiwixRestart}
</>
@ -90,7 +93,7 @@ export function Getters() {
// Getters are Downloads or Uploads.
const [selectedGetter, setSelectedGetter] = useState(null);
const gettersDisabled = status?.flags?.indexOf('refresh_complete') === -1;
const gettersDisabled = status?.flags?.refresh_completed !== true;
const handleSetGetter = (e, value) => {
if (e) {
@ -172,7 +175,6 @@ export function DashboardPage() {
setSearchTags,
months, dateRange, setDates, clearDate,
} = useSearchSuggestions(searchStr, activeTags);
const {status} = useContext(StatusContext);
React.useEffect(() => {
setSuggestionSearchStr(localSearchStr);
@ -278,7 +280,7 @@ export function DashboardPage() {
</Grid.Row>
</Grid>
</Media>
{!searchStr && <FlagsMessages flags={status['flags']}/>}
{!searchStr && <FlagsMessages/>}
{body}
</PageContainer>
}

View file

@ -827,7 +827,7 @@ export const StatusProvider = (props) => {
export const useStatusFlag = (flag) => {
const {status} = useContext(StatusContext);
return status && status['flags'] && status['flags'].indexOf(flag) >= 0;
return status && status['flags'] && status['flags'][flag];
}
export const useCPUTemperature = () => {

View file

@ -150,7 +150,7 @@ def test_split_path_stem_and_suffix(path, expected):
@pytest.mark.asyncio
async def test_refresh_files(test_session, make_files_structure, assert_file_groups):
async def test_refresh_files(test_async_client, test_session, make_files_structure, assert_file_groups):
"""All files in the media directory should be found when calling `refresh_files`"""
files = make_files_structure([
'foo.txt',
@ -177,7 +177,7 @@ async def test_refresh_files(test_session, make_files_structure, assert_file_gro
@pytest.mark.asyncio
async def test_file_group_location(test_session, make_files_structure):
async def test_file_group_location(test_async_client, test_session, make_files_structure):
"""FileGroup can return the URL necessary to preview the FileGroup."""
make_files_structure({
'foo/one.txt': 'one',
@ -191,8 +191,8 @@ async def test_file_group_location(test_session, make_files_structure):
@pytest.mark.asyncio
async def test_refresh_bogus_files(test_session, make_files_structure, test_directory, assert_file_groups,
insert_file_group):
async def test_refresh_bogus_files(test_async_client, test_session, make_files_structure, test_directory,
assert_file_groups, insert_file_group):
"""Bogus files are removed during a refresh."""
make_files_structure(['does exist.txt'])
await lib.refresh_files()
@ -212,7 +212,7 @@ async def test_refresh_bogus_files(test_session, make_files_structure, test_dire
@pytest.mark.asyncio
async def test_refresh_empty_media_directory(test_session, test_directory):
async def test_refresh_empty_media_directory(test_async_client, test_session, test_directory):
"""refresh_paths will refuse to refresh with an empty media directory."""
with pytest.raises(UnknownDirectory):
await lib.refresh_files()
@ -369,7 +369,7 @@ async def test_file_group_tag(test_session, make_files_structure, test_directory
@pytest.mark.asyncio
async def test_refresh_a_text_no_indexer(test_session, make_files_structure):
async def test_refresh_a_text_no_indexer(test_async_client, test_session, make_files_structure):
"""File.a_text is filled even if the file does not match an Indexer."""
make_files_structure(['foo', 'bar-bar'])
@ -380,7 +380,7 @@ async def test_refresh_a_text_no_indexer(test_session, make_files_structure):
@pytest.mark.asyncio
async def test_refresh_many_files(test_session, make_files_structure):
async def test_refresh_many_files(test_async_client, test_session, make_files_structure):
"""Used to profile file refreshing"""
count = 10_000
make_files_structure([f'{uuid4()}.txt' for _ in range(count)])
@ -416,7 +416,7 @@ async def test_refresh_cancel(test_session, make_files_structure, test_directory
@pytest.mark.asyncio
async def test_mime_type(test_session, make_files_structure, test_directory, assert_files):
async def test_mime_type(test_async_client, test_session, make_files_structure, test_directory, assert_files):
"""Files module uses the `file` command to get the mimetype of each file."""
from PIL import Image
@ -450,7 +450,7 @@ async def test_mime_type(test_session, make_files_structure, test_directory, ass
@pytest.mark.asyncio
async def test_files_indexer(test_session, make_files_structure, test_directory):
async def test_files_indexer(test_async_client, test_session, make_files_structure, test_directory):
"""An Indexer is provided for each file based on it's mimetype or contents."""
source_files: List[str] = [
'a text file.txt',
@ -751,7 +751,8 @@ def test_file_group_merge(test_session, test_directory, make_files_structure, ta
@pytest.mark.asyncio
async def test_move(test_session, test_directory, make_files_structure, video_bytes, singlefile_contents_factory):
async def test_move(test_async_client, test_session, test_directory, make_files_structure, video_bytes,
singlefile_contents_factory):
"""files.lib.move behaves likes posix mv"""
make_files_structure({
'foo/bar/video.mp4': video_bytes,
@ -784,7 +785,7 @@ async def test_move(test_session, test_directory, make_files_structure, video_by
@pytest.mark.asyncio
async def test_move_files(test_session, test_directory, make_files_structure):
async def test_move_files(test_async_client, test_session, test_directory, make_files_structure):
"""Files can be moved using files.lib.move."""
one, two = make_files_structure({
'foo/one.txt': 'one',
@ -799,7 +800,7 @@ async def test_move_files(test_session, test_directory, make_files_structure):
@pytest.mark.asyncio
async def test_move_deep_directory(test_session, test_directory, make_files_structure):
async def test_move_deep_directory(test_async_client, test_session, test_directory, make_files_structure):
"""Moving files/directories from one deep directory to another is supported."""
baz, foo, quuz_mp4, quuz_txt, quux = make_files_structure({
'foo/foo.txt': 'foo',
@ -838,7 +839,7 @@ async def test_move_deep_directory(test_session, test_directory, make_files_stru
@pytest.mark.asyncio
async def test_move_directory(test_session, test_directory, make_files_structure, assert_directories):
async def test_move_directory(test_async_client, test_session, test_directory, make_files_structure, assert_directories):
"""A Directory record is deleted when it's directory is deleted."""
make_files_structure({
'foo/one.txt': 'one',
@ -889,7 +890,7 @@ async def test_move_error(test_session, test_directory, make_files_structure, vi
@pytest.mark.asyncio
async def test_file_group_move(test_session, make_files_structure, test_directory, video_bytes, srt_text):
async def test_file_group_move(test_async_client, test_session, make_files_structure, test_directory, video_bytes, srt_text):
"""Test FileGroup's move method"""
video, srt = make_files_structure({
'video.mp4': video_bytes,
@ -913,7 +914,7 @@ async def test_file_group_move(test_session, make_files_structure, test_director
@pytest.mark.asyncio
async def test_move_tagged(test_session, test_directory, make_files_structure, tag_factory):
async def test_move_tagged(test_async_client, test_session, test_directory, make_files_structure, tag_factory):
"""A FileGroup's tag is preserved when moved or renamed."""
tag = tag_factory()
foo, bar, = make_files_structure({
@ -955,7 +956,7 @@ async def test_move_tagged(test_session, test_directory, make_files_structure, t
@pytest.mark.asyncio
async def test_html_index(test_session, test_directory, make_files_structure):
async def test_html_index(test_async_client, test_session, test_directory, make_files_structure):
make_files_structure({
'archive.html': '''<html>
<title>The Title</title>
@ -1001,7 +1002,7 @@ Outside element.'''
@pytest.mark.asyncio
async def test_doc_indexer(test_session, example_doc):
async def test_doc_indexer(test_async_client, test_session, example_doc):
"""The contents of a Microsoft doc files can be indexed."""
await lib.refresh_files()
assert test_session.query(FileGroup).count() == 1
@ -1012,7 +1013,7 @@ async def test_doc_indexer(test_session, example_doc):
@pytest.mark.asyncio
async def test_docx_indexer(test_session, example_docx):
async def test_docx_indexer(test_async_client, test_session, example_docx):
"""The contents of a Microsoft docx files can be indexed."""
await lib.refresh_files()
assert test_session.query(FileGroup).count() == 1
@ -1023,7 +1024,7 @@ async def test_docx_indexer(test_session, example_docx):
@pytest.mark.asyncio
async def test_file_search_date_range(test_session, example_pdf, example_doc):
async def test_file_search_date_range(test_async_client, test_session, example_pdf, example_doc):
"""Test searching FileGroups by their published datetime."""
await lib.refresh_files()
doc, pdf = test_session.query(FileGroup).order_by(FileGroup.primary_path).all()

View file

@ -9,7 +9,7 @@ from wrolpi.files.models import FileGroup
@pytest.mark.asyncio
async def test_pdf_title(test_session, example_pdf):
async def test_pdf_title(test_async_client, test_session, example_pdf):
"""PDF modeler extracts a PDF's title and contents."""
await files_lib.refresh_files()

View file

@ -3,7 +3,6 @@ import contextlib
import multiprocessing
import subprocess
from datetime import datetime
from typing import List
from sqlalchemy import Column, Boolean, Integer
@ -127,19 +126,15 @@ refresh_cleanup = Flag('refresh_cleanup')
refresh_complete = Flag('refresh_complete', store_db=True)
def get_flags() -> List[str]:
def get_flags() -> dict:
"""Return a list of all Flags which are set."""
flags = []
if db_up.is_set():
flags.append('db_up')
if refreshing.is_set():
flags.append('refreshing')
if refresh_complete.is_set():
flags.append('refresh_complete')
if outdated_zims.is_set():
flags.append('outdated_zims')
if kiwix_restart.is_set():
flags.append('kiwix_restart')
flags = dict(
db_up=db_up.is_set(),
refreshing=refreshing.is_set(),
refresh_complete=refresh_complete.is_set(),
outdated_zims=outdated_zims.is_set(),
kiwix_restart=kiwix_restart.is_set(),
)
return flags

View file

@ -801,7 +801,7 @@ def test_find_file(test_directory, make_files_structure):
assert common.find_file(test_directory, 'does not exist', 100) is None
def test_config_backup(test_config, test_directory):
def test_config_backup(test_async_client, test_config, test_directory):
"""Configs have a backup each day."""
config = common.get_wrolpi_config()

View file

@ -49,7 +49,7 @@ def test_events_history_limit():
@pytest.mark.asyncio
async def test_get_events():
async def test_get_events(test_async_client):
after = now()
Events.send_global_refresh_started()

View file

@ -17,28 +17,28 @@ def assert_db(session: Session, name: str, expected: bool):
def test_flags(test_async_client, test_session, flags_lock):
"""DB flags can be saved."""
assert flags.refresh_complete.is_set() is False
assert flags.get_flags() == []
assert not any(v for k, v in flags.get_flags().items())
flags.refresh_complete.set()
assert_db(test_session, 'refresh_complete', True)
assert flags.get_flags() == ['refresh_complete']
assert flags.get_flags()['refresh_complete']
flags.refresh_complete.clear()
assert_db(test_session, 'refresh_complete', False)
assert flags.get_flags() == []
assert not any(v for k, v in flags.get_flags().items())
def test_flags_with(test_async_client, flags_lock):
"""A Flag can be used with `with` context."""
assert flags.refreshing.is_set() is False, 'Flag should not be set by default'
assert flags.get_flags() == []
assert not any(v for k, v in flags.get_flags().items())
with flags.refreshing:
assert flags.refreshing.is_set() is True, 'Flag should be set within context.'
assert flags.get_flags() == ['refreshing']
assert flags.get_flags()['refreshing']
assert flags.refreshing.is_set() is False, 'Flag should not be restored after context.'
assert flags.get_flags() == []
assert not any(v for k, v in flags.get_flags().items())
with pytest.raises(ValueError):
# Can't do two `refreshing` as once.

View file

@ -382,7 +382,7 @@ async def test_get_status(test_async_client, test_session):
assert 'throttle_status' in response.json and isinstance(response.json['throttle_status'], str)
assert 'version' in response.json and isinstance(response.json['version'], str)
assert 'memory_stats' in response.json and isinstance(response.json['memory_stats'], dict)
assert 'flags' in response.json and isinstance(response.json['flags'], list)
assert 'flags' in response.json and isinstance(response.json['flags'], dict)
def test_post_download(test_session, test_client, test_download_manager_config):