Skip to content

Commit d13a9bb

Browse files
committed
test: added test for all files under utils/taskserver
1 parent 0b273be commit d13a9bb

File tree

6 files changed

+378
-0
lines changed

6 files changed

+378
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:taskwarrior/app/utils/taskserver/credentials.dart';
3+
4+
void main() {
5+
group('Credentials', () {
6+
test('Credentials constructor sets fields correctly', () {
7+
const credentials = Credentials(
8+
org: 'testOrg',
9+
user: 'testUser',
10+
key: 'testKey',
11+
);
12+
13+
expect(credentials.org, 'testOrg');
14+
expect(credentials.user, 'testUser');
15+
expect(credentials.key, 'testKey');
16+
});
17+
18+
test('Credentials.fromString parses string correctly', () {
19+
final credentials = Credentials.fromString('testOrg/testUser/testKey');
20+
21+
expect(credentials.org, 'testOrg');
22+
expect(credentials.user, 'testUser');
23+
expect(credentials.key, 'testKey');
24+
});
25+
26+
test('Credentials.fromString throws on invalid string format', () {
27+
expect(() => Credentials.fromString('invalidString'),
28+
throwsA(isA<RangeError>()));
29+
expect(() => Credentials.fromString('invalid/String'),
30+
throwsA(isA<RangeError>()));
31+
});
32+
});
33+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:taskwarrior/app/utils/taskserver/parse_taskrc.dart';
3+
4+
void main() {
5+
group('parseTaskrc', () {
6+
test('parses a taskrc file correctly', () {
7+
const contents = '''
8+
# This is a comment
9+
key1=value1
10+
key2 = value2
11+
key3=value3
12+
# Another comment
13+
key4 = value4
14+
''';
15+
final result = parseTaskrc(contents);
16+
17+
expect(result, {
18+
'key1': 'value1',
19+
'key2': 'value2',
20+
'key3': 'value3',
21+
'key4': 'value4',
22+
});
23+
});
24+
25+
test('ignores comments and empty lines', () {
26+
const contents = '''
27+
# This is a comment
28+
key1=value1
29+
30+
key2 = value2
31+
# Another comment
32+
''';
33+
final result = parseTaskrc(contents);
34+
35+
expect(result, {
36+
'key1': 'value1',
37+
'key2': 'value2',
38+
});
39+
});
40+
41+
test('handles lines with escaped slashes correctly', () {
42+
const contents = '''
43+
key1=value\\/1
44+
key2 = value\\/2
45+
''';
46+
final result = parseTaskrc(contents);
47+
48+
expect(result, {
49+
'key1': 'value/1',
50+
'key2': 'value/2',
51+
});
52+
});
53+
54+
test('trims keys and values', () {
55+
const contents = '''
56+
key1 = value1
57+
key2= value2
58+
key3 =value3
59+
''';
60+
final result = parseTaskrc(contents);
61+
62+
expect(result, {
63+
'key1': 'value1',
64+
'key2': 'value2',
65+
'key3': 'value3',
66+
});
67+
});
68+
69+
test('returns empty map for empty input', () {
70+
const contents = '';
71+
final result = parseTaskrc(contents);
72+
73+
expect(result, {});
74+
});
75+
});
76+
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import 'dart:io';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:taskwarrior/app/utils/taskserver/pem_file_paths.dart';
4+
5+
class MockX509Certificate implements X509Certificate {
6+
@override
7+
final String pem;
8+
9+
MockX509Certificate(this.pem);
10+
11+
@override
12+
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
13+
}
14+
15+
void main() {
16+
group('PemFilePaths', () {
17+
setUp(() {
18+
// Create test directory and files if they don't exist
19+
Directory('test/fixtures').createSync(recursive: true);
20+
File('test/fixtures/server.pem')
21+
.writeAsStringSync('matching-pem-content');
22+
});
23+
24+
tearDown(() {
25+
// Clean up test files
26+
if (File('test/fixtures/server.pem').existsSync()) {
27+
File('test/fixtures/server.pem').deleteSync();
28+
}
29+
});
30+
31+
test('PemFilePaths constructor sets fields correctly', () {
32+
const pemFilePaths = PemFilePaths(
33+
ca: 'path/to/ca.pem',
34+
certificate: 'path/to/cert.pem',
35+
key: 'path/to/key.pem',
36+
serverCert: 'path/to/server.pem',
37+
);
38+
39+
expect(pemFilePaths.ca, 'path/to/ca.pem');
40+
expect(pemFilePaths.certificate, 'path/to/cert.pem');
41+
expect(pemFilePaths.key, 'path/to/key.pem');
42+
expect(pemFilePaths.serverCert, 'path/to/server.pem');
43+
});
44+
45+
test('PemFilePaths.fromTaskrc parses taskrc correctly', () {
46+
final taskrc = {
47+
'taskd.ca': 'path/to/ca.pem',
48+
'taskd.certificate': 'path/to/cert.pem',
49+
'taskd.key': 'path/to/key.pem',
50+
};
51+
final pemFilePaths = PemFilePaths.fromTaskrc(taskrc);
52+
53+
expect(pemFilePaths.ca, 'path/to/ca.pem');
54+
expect(pemFilePaths.certificate, 'path/to/cert.pem');
55+
expect(pemFilePaths.key, 'path/to/key.pem');
56+
expect(pemFilePaths.serverCert, isNull);
57+
});
58+
59+
test('PemFilePaths.securityContext creates SecurityContext correctly', () {
60+
const pemFilePaths = PemFilePaths(
61+
ca: 'test/fixtures/ca.pem',
62+
certificate: 'test/fixtures/cert.pem',
63+
key: 'test/fixtures/key.pem',
64+
);
65+
66+
final context = pemFilePaths.securityContext();
67+
68+
expect(context, isA<SecurityContext>());
69+
});
70+
71+
test(
72+
'PemFilePaths.savedServerCertificateMatches returns true for matching certificates',
73+
() {
74+
const pemFilePaths = PemFilePaths(
75+
serverCert: 'test/fixtures/server.pem',
76+
);
77+
final badServerCert = MockX509Certificate('matching-pem-content');
78+
79+
final result = pemFilePaths.savedServerCertificateMatches(badServerCert);
80+
81+
expect(result, true);
82+
});
83+
84+
test(
85+
'PemFilePaths.savedServerCertificateMatches returns false for non-matching certificates',
86+
() {
87+
const pemFilePaths = PemFilePaths(
88+
serverCert: 'test/fixtures/server.pem',
89+
);
90+
final badServerCert = MockX509Certificate('non-matching-pem-content');
91+
92+
// Write the non-matching content to the server cert file for the test
93+
File('test/fixtures/server.pem')
94+
.writeAsStringSync('different-pem-content');
95+
96+
final result = pemFilePaths.savedServerCertificateMatches(badServerCert);
97+
98+
expect(result, false);
99+
});
100+
101+
test('PemFilePaths.map returns correct map representation', () {
102+
const pemFilePaths = PemFilePaths(
103+
ca: 'path/to/ca.pem',
104+
certificate: 'path/to/cert.pem',
105+
key: 'path/to/key.pem',
106+
serverCert: 'path/to/server.pem',
107+
);
108+
109+
final map = pemFilePaths.map;
110+
111+
expect(map, {
112+
'taskd.ca': 'path/to/ca.pem',
113+
'taskd.certificate': 'path/to/cert.pem',
114+
'taskd.key': 'path/to/key.pem',
115+
'server.cert': 'path/to/server.pem',
116+
});
117+
});
118+
119+
test('PemFilePaths.map omits null values', () {
120+
const pemFilePaths = PemFilePaths(
121+
ca: 'path/to/ca.pem',
122+
certificate: 'path/to/cert.pem',
123+
key: null,
124+
serverCert: null,
125+
);
126+
127+
final map = pemFilePaths.map;
128+
129+
expect(map, {
130+
'taskd.ca': 'path/to/ca.pem',
131+
'taskd.certificate': 'path/to/cert.pem',
132+
});
133+
});
134+
});
135+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:taskwarrior/app/utils/taskserver/server.dart';
3+
import 'package:taskwarrior/app/utils/taskserver/taskrc_exception.dart';
4+
5+
void main() {
6+
group('Server', () {
7+
test('Server constructor sets fields correctly', () {
8+
const server = Server(
9+
address: 'example.com',
10+
port: 8080,
11+
);
12+
13+
expect(server.address, 'example.com');
14+
expect(server.port, 8080);
15+
});
16+
17+
test('Server.fromString parses valid server string', () {
18+
final server = Server.fromString('example.com:8080');
19+
20+
expect(server.address, 'example.com');
21+
expect(server.port, 8080);
22+
});
23+
24+
test(
25+
'Server.fromString throws TaskrcException for invalid format without colon',
26+
() {
27+
expect(() => Server.fromString('example.com8080'),
28+
throwsA(isA<TaskrcException>()));
29+
});
30+
31+
test('Server.fromString throws TaskrcException for invalid port', () {
32+
expect(() => Server.fromString('example.com:invalid'),
33+
throwsA(isA<TaskrcException>()));
34+
});
35+
36+
test('Server.toString returns correct string representation', () {
37+
const server = Server(
38+
address: 'example.com',
39+
port: 8080,
40+
);
41+
42+
expect(server.toString(), 'example.com:8080');
43+
});
44+
});
45+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:taskwarrior/app/utils/taskserver/taskrc_exception.dart';
3+
4+
void main() {
5+
group('TaskrcException', () {
6+
test('TaskrcException constructor sets message correctly', () {
7+
final exception = TaskrcException('An error occurred');
8+
9+
expect(exception.message, 'An error occurred');
10+
});
11+
12+
test('TaskrcException.toString returns correct message', () {
13+
final exception = TaskrcException('An error occurred');
14+
15+
expect(exception.toString(), 'An error occurred');
16+
});
17+
});
18+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:taskwarrior/app/utils/taskserver/taskrc.dart';
3+
import 'package:taskwarrior/app/utils/taskserver/server.dart';
4+
import 'package:taskwarrior/app/utils/taskserver/credentials.dart';
5+
import 'package:taskwarrior/app/utils/taskserver/pem_file_paths.dart';
6+
7+
void main() {
8+
group('Taskrc', () {
9+
test('Taskrc constructor sets fields correctly', () {
10+
const server = Server(address: 'example.com', port: 8080);
11+
const credentials = Credentials(org: 'org', user: 'user', key: 'key');
12+
const pemFilePaths = PemFilePaths(
13+
ca: 'path/to/ca.pem',
14+
certificate: 'path/to/cert.pem',
15+
key: 'path/to/key.pem',
16+
);
17+
final taskrc = Taskrc(
18+
server: server,
19+
credentials: credentials,
20+
pemFilePaths: pemFilePaths,
21+
);
22+
23+
expect(taskrc.server, server);
24+
expect(taskrc.credentials, credentials);
25+
expect(taskrc.pemFilePaths, pemFilePaths);
26+
});
27+
28+
test('Taskrc.fromString parses valid taskrc string', () {
29+
const taskrcString = '''
30+
taskd.server=example.com:8080
31+
taskd.credentials=org/user/key
32+
taskd.ca=path/to/ca.pem
33+
taskd.certificate=path/to/cert.pem
34+
taskd.key=path/to/key.pem
35+
''';
36+
final taskrc = Taskrc.fromString(taskrcString);
37+
38+
expect(taskrc.server, isA<Server>());
39+
expect(taskrc.credentials, isA<Credentials>());
40+
expect(taskrc.pemFilePaths, isA<PemFilePaths>());
41+
});
42+
43+
test('Taskrc.fromMap parses valid taskrc map', () {
44+
final taskrcMap = {
45+
'taskd.server': 'example.com:8080',
46+
'taskd.credentials': 'org/user/key',
47+
'taskd.ca': 'path/to/ca.pem',
48+
'taskd.certificate': 'path/to/cert.pem',
49+
'taskd.key': 'path/to/key.pem',
50+
};
51+
final taskrc = Taskrc.fromMap(taskrcMap);
52+
53+
expect(taskrc.server, isA<Server>());
54+
expect(taskrc.credentials, isA<Credentials>());
55+
expect(taskrc.pemFilePaths, isA<PemFilePaths>());
56+
});
57+
58+
test('Taskrc.fromMap handles missing optional fields', () {
59+
final taskrcMap = {
60+
'taskd.ca': 'path/to/ca.pem',
61+
'taskd.certificate': 'path/to/cert.pem',
62+
'taskd.key': 'path/to/key.pem',
63+
};
64+
final taskrc = Taskrc.fromMap(taskrcMap);
65+
66+
expect(taskrc.server, isNull);
67+
expect(taskrc.credentials, isNull);
68+
expect(taskrc.pemFilePaths, isA<PemFilePaths>());
69+
});
70+
});
71+
}

0 commit comments

Comments
 (0)