# HG changeset patch # User Magnus Schieder # Date 1516270464 -3600 # Node ID 7125e67d5acb79fa2679caa358fa0cbd98193ab6 # Parent f441913a5cdc45a721ae6babcb6201353dd250b7 dd getan testdata, add multi-selection Bug report. * add /test_data/getan_test_data.py to create a new getan database with test data. * update report 20170317 BER. Add a guide to recreating the bug. * TDOD: Fix the bug. diff -r f441913a5cdc -r 7125e67d5acb TODO --- a/TODO Thu Jan 04 10:59:19 2018 +0100 +++ b/TODO Thu Jan 18 11:14:24 2018 +0100 @@ -1,3 +1,61 @@ + +20180117 Magnus Schieder + + 20170317 BER: Reproduce and then fix a defect that it is surprising which + entries are moved by `m` or deleted by 'd'. + It probably has to do how multi-selection are handled. Maybe they + are not cleared properly at the end of an operation. + One description: It happens when you have changed a lot of entries + from different projects (I assume), e.g. by editing the description, + the length or timedate and then use move where you intend to only move + one, the unwanted result is several moved entries. + + Update: + getan 2.1 + + Creating a new database with test data: + + 1) Delete getan_test_data.db if it already exists to create a new database. + 2) Execute getan_test_data.py to get the test database getan_test_data.db. + (getan/test_data/getan_test_data.py) + +- Bug 1.0 + 2) Open getan with the test database. (getan /path/getan_test_data.db) + 3) Switch to the entries from the project pro1 with tab. + 4) Mark with return and arrow keys ent1 and ent2. + 5) Go back to the projects with tab. + 6) Switch back to the entries of project pro1. + 7) Mark this time ent3 and ent4. + 8) Press m, then 3 and then y to move ent3 and ent4 to pro3. + + Expectation: + ent3 and ent4 are moved to pro3. + + Result: + ent1, ent2, ent3 and ent4 were moved to pro3. + +- Bug 1.1 + Execute 1) to 7) from 1.0. + 8) Press d to delete ent3 and ent4. + + Expectation: + ent3 and ent4 are deleted. + + Result: + ent1, en2, ent3 and ent4 are deleted. + +- Bug2 + Execute 1) to 4) from 1.0. + 5) Press m. + 6) Now also mark ent3 and pro ent4. + 7) Press 3 and then y to move ent1, ent2, ent3 and ent4 to pro3. + + Expectation: + After pressing m, you can not mark additional entries. + + Result: + Only ent1 and ent2 are moved, though all are selected. + 20180104 BER (minor) Display licensing information with --version and usage. Implementation idea: change this when moving away from optparse. @@ -10,14 +68,7 @@ 20170504 BER: Some multi-user installations do not want a logfile by default. We could solve this requirement by making it configurable. -20170317 BER: Reproduce and then fix a defect that it is surprising which - entries are moved by `m` or deleted by 'd'. - It probably has to do how multi-selection are handled. Maybe they - are not cleared properly at the end of an operation. - One description: It happens when you have changed a lot of entries - from different projects (I assume), e.g. by editing the description, - the length or timedate and then use move where you intend to only move - one, the unwanted result is several moved entries. + 20160912 BER: Better code: states.py: classes EditEntryState and AdjustEntryState have same methods exit() and set_focus(), maybe join them? diff -r f441913a5cdc -r 7125e67d5acb test_data/getan_test_data.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test_data/getan_test_data.py Thu Jan 18 11:14:24 2018 +0100 @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +# +# Author: Magnus Schieder +# (c) 2018 Intevation GmbH +# +# Program to create test data for getan (getan_test_data.db). +# Please delete existing getan_test_data.db. +# Open getan with getan_test_data.db: getan /path/getan_test_data.db +# +# This is Free Software licensed under the terms of GPLv3 or later. +# For details see LICENSE coming with the source of 'getan'. +# + + +import sqlite3 + + +def main(): + + conn = sqlite3.connect("getan_test_data.db") + + db = conn.cursor() + + # create getan schema. + db.execute('''CREATE TABLE projects ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + key VARCHAR(16) NOT NULL CONSTRAINT unique_key UNIQUE, + description VARCHAR(256), + active BOOLEAN DEFAULT 1) + ''') + + db.execute('''CREATE TABLE entries ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + project_id INTEGER REFERENCES projects(id), + start_time TIMESTAMP NOT NULL, + stop_time TIMESTAMP NOT NULL, + description VARCHAR(256), + + CHECK (strftime('%s', start_time) <= strftime('%s', stop_time))) + ''') + + # List of projects. + # (key, 'description') + pro = [ + (1, 'pro1'), + (2, 'pro2'), + (3, 'pro3'), + ] + + # List of entries with test data. + # (project_id, 'start_time', 'stop_time', 'description') + ent = [ + (2, '2018-01-01 01:01:01.0', '2018-01-01 02:01:01.0', 'ent9'), + (2, '2018-01-01 01:01:01.0', '2018-01-01 02:01:01.0', 'ent8'), + (2, '2018-01-01 01:01:01.0', '2018-01-01 02:01:01.0', 'ent7'), + (1, '2018-01-01 01:01:01.0', '2018-01-01 02:01:01.0', 'ent6'), + (1, '2018-01-01 01:01:01.0', '2018-01-01 02:01:01.0', 'ent5'), + (1, '2018-01-01 01:01:01.0', '2018-01-01 02:01:01.0', 'ent4'), + (1, '2018-01-01 01:01:01.0', '2018-01-01 02:01:01.0', 'ent3'), + (1, '2018-01-01 01:01:01.0', '2018-01-01 02:01:01.0', 'ent2'), + (1, '2018-01-01 01:01:01.0', '2018-01-01 02:01:01.0', 'ent1'), + ] + + db.executemany("INSERT INTO projects(key, description) VALUES (?,?)", pro) + + db.executemany('''INSERT INTO entries(project_id, start_time, stop_time, + description) VALUES (?,?,?,?)''', ent) + + conn.commit() + conn.close() + +if __name__ == '__main__': + main()