94 lines
2.9 KiB
Dart
94 lines
2.9 KiB
Dart
// SPDX-FileCopyrightText: 2026 TatuChat
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:tatchat/utils/miniapp_meta.dart';
|
|
|
|
void main() {
|
|
test('Parses a valid manifest from meta tags', () {
|
|
const html = '''
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="mini-app-id" content="myapp">
|
|
<meta name="mini-app-name" content="My App">
|
|
<meta name="mini-app-category" content="productivity">
|
|
<meta name="mini-app-description" content="Does things">
|
|
<meta name="mini-app-logo" content="data:image/png;base64,AAAA">
|
|
<meta name="mini-app-in-chat" content="TRUE">
|
|
</head>
|
|
<body></body>
|
|
</html>
|
|
''';
|
|
final meta = parseMiniAppMeta(html);
|
|
expect(meta.id, 'myapp');
|
|
expect(meta.name, 'My App');
|
|
expect(meta.category, 'productivity');
|
|
expect(meta.description, 'Does things');
|
|
expect(meta.logo, 'data:image/png;base64,AAAA');
|
|
expect(meta.inChat, isTrue);
|
|
});
|
|
|
|
test('Allows empty optional values and defaults inChat to false', () {
|
|
const html = '''
|
|
<html><head>
|
|
<meta name="mini-app-id" content="empty">
|
|
<meta name="mini-app-name" content="Empty">
|
|
<meta name="mini-app-category" content="">
|
|
<meta name="mini-app-description" content="">
|
|
<meta name="mini-app-logo" content="">
|
|
<meta name="mini-app-in-chat" content="">
|
|
</head></html>
|
|
''';
|
|
final meta = parseMiniAppMeta(html);
|
|
expect(meta.id, 'empty');
|
|
expect(meta.name, 'Empty');
|
|
expect(meta.category, '');
|
|
expect(meta.description, '');
|
|
expect(meta.logo, '');
|
|
expect(meta.inChat, isFalse);
|
|
});
|
|
|
|
test('Independent of attribute order and quoting style', () {
|
|
final tags = extractMetaTags(
|
|
'<meta content="x" name="mini-app-id">'
|
|
"<meta name='mini-app-name' content='N'>",
|
|
);
|
|
expect(tags['mini-app-id'], 'x');
|
|
expect(tags['mini-app-name'], 'N');
|
|
});
|
|
|
|
test('Rejects documents missing required meta tags', () {
|
|
expect(() => parseMiniAppMeta('<html><head></head></html>'),
|
|
throwsFormatException);
|
|
const missingOptional = '''
|
|
<meta name="mini-app-id" content="myapp">
|
|
<meta name="mini-app-name" content="My App">
|
|
''';
|
|
expect(() => parseMiniAppMeta(missingOptional), throwsFormatException);
|
|
});
|
|
|
|
test('Rejects empty or missing id/name', () {
|
|
const emptyId = '''
|
|
<meta name="mini-app-id" content="">
|
|
<meta name="mini-app-name" content="My App">
|
|
<meta name="mini-app-category" content="">
|
|
<meta name="mini-app-description" content="">
|
|
<meta name="mini-app-logo" content="">
|
|
<meta name="mini-app-in-chat" content="">
|
|
''';
|
|
expect(() => parseMiniAppMeta(emptyId), throwsFormatException);
|
|
|
|
const emptyName = '''
|
|
<meta name="mini-app-id" content="myapp">
|
|
<meta name="mini-app-name" content=" ">
|
|
<meta name="mini-app-category" content="">
|
|
<meta name="mini-app-description" content="">
|
|
<meta name="mini-app-logo" content="">
|
|
<meta name="mini-app-in-chat" content="">
|
|
''';
|
|
expect(() => parseMiniAppMeta(emptyName), throwsFormatException);
|
|
});
|
|
} |