tane/apps/app_seeds/test/services/social_settings_test.dart
vjrj fa53295439 feat(market): host and publish the cover photo with each offer
Wire the Blossom MediaTransport into publishing: shareable lots carry
their varietyId, publishLots uploads the lot's cover photo and puts the
returned URL on the offer (best-effort — a hosting failure still publishes
the offer, just without a photo). Add a configurable media server (Comunes
default, empty to opt out) to settings and the market advanced config.
2026-07-10 21:12:36 +02:00

83 lines
3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter_test/flutter_test.dart';
import 'package:tane/security/secret_store.dart';
import 'package:tane/services/social_settings.dart';
/// In-memory [SecretStore] for tests.
class FakeSecretStore implements SecretStore {
final Map<String, String> _data = {};
@override
Future<String?> read(String key) async => _data[key];
@override
Future<void> write(String key, String value) async => _data[key] = value;
}
void main() {
late SocialSettings settings;
setUp(() => settings = SocialSettings(FakeSecretStore()));
test('defaults: empty area, but relays fall back to the defaults', () async {
expect(await settings.areaGeohash(), '');
expect(await settings.relayUrls(), SocialSettings.defaultRelays);
// Not configured yet: the area is still unset.
expect(await settings.isConfigured, isFalse);
});
test('an explicitly empty relay choice turns the network off', () async {
await settings.setRelayUrls(const []);
expect(await settings.relayUrls(), isEmpty);
});
test('media server defaults, is configurable, and can be turned off',
() async {
expect(await settings.mediaServerUrl(), SocialSettings.defaultMediaServer);
await settings.setMediaServerUrl(' https://blossom.example ');
expect(await settings.mediaServerUrl(), 'https://blossom.example');
await settings.setMediaServerUrl(''); // explicit empty = no photo hosting
expect(await settings.mediaServerUrl(), '');
});
test('stores and normalises the area geohash (trim + lowercase)', () async {
await settings.setAreaGeohash(' SP3E9 ');
expect(await settings.areaGeohash(), 'sp3e9');
});
test('stores relay urls, dropping blanks', () async {
await settings.setRelayUrls([
'wss://relay.comunes.org',
' ',
'wss://seeds.example.org',
]);
expect(await settings.relayUrls(),
['wss://relay.comunes.org', 'wss://seeds.example.org']);
});
test('is configured once an area is set (relays are defaulted)', () async {
expect(await settings.isConfigured, isFalse); // no area yet
await settings.setAreaGeohash('sp3e9');
expect(await settings.isConfigured, isTrue);
});
test('search precision defaults to 4 (a wide "around here")', () async {
expect(await settings.searchPrecision(), 4);
});
test('stores and reads back the search precision', () async {
await settings.setSearchPrecision(3);
expect(await settings.searchPrecision(), 3);
await settings.setSearchPrecision(5);
expect(await settings.searchPrecision(), 5);
});
test('search precision is clamped to the 35 range', () async {
await settings.setSearchPrecision(1);
expect(await settings.searchPrecision(), 3);
await settings.setSearchPrecision(9);
expect(await settings.searchPrecision(), 5);
});
test('a corrupt stored precision falls back to the default', () async {
final store = FakeSecretStore();
await store.write('tane.social.search_precision', 'oops');
expect(await SocialSettings(store).searchPrecision(), 4);
});
}