import 'package:flutter_test/flutter_test.dart'; import 'package:kickkings_support/config.dart'; import 'package:kickkings_support/models/login_result.dart'; import 'package:kickkings_support/models/support_message.dart'; import 'package:kickkings_support/models/support_ticket.dart'; void main() { test('normalizes a base url', () { expect( normalizeBaseUrl('https://kickkings.playpoolstudios.com/'), 'https://kickkings.playpoolstudios.com', ); expect(normalizeBaseUrl(' https://example.com/// '), 'https://example.com'); }); test('ticket query omits empty filters', () { expect(ticketListQuery(status: 'open'), {'status': 'open'}); expect(ticketListQuery(status: 'closed', category: 'bug'), { 'status': 'closed', 'category': 'bug', }); expect(ticketListQuery(), isEmpty); }); test('parses a ticket and a thread', () { final ticket = SupportTicket.fromJson({ 'id': 'ticket-1', 'userId': 42, 'username': 'playername', 'category': 'bug', 'categoryLabel': 'Report Bug', 'status': 'open', 'createdAt': '2026-10-15T12:00:00.000Z', 'updatedAt': '2026-10-15T12:00:00.000Z', 'lastMessageAt': '2026-10-15T12:05:00.000Z', 'lastMessagePreview': 'The match froze', }); expect(ticket.userId, 42); expect(ticket.displayCategory, 'Report Bug'); expect(ticket.isClosed, isFalse); expect( ticket.lastMessageAt.toUtc().toIso8601String(), '2026-10-15T12:05:00.000Z', ); final thread = SupportThread.fromJson({ 'ticket': { 'id': 'ticket-1', 'userId': 42, 'username': 'playername', 'category': 'bug', 'categoryLabel': 'Report Bug', 'status': 'closed', 'createdAt': '2026-10-15T12:00:00.000Z', 'updatedAt': '2026-10-15T12:10:00.000Z', 'lastMessageAt': '2026-10-15T12:10:00.000Z', 'lastMessagePreview': 'We are looking into this.', }, 'messages': [ { 'id': 'message-1', 'ticketId': 'ticket-1', 'authorKind': 'player', 'authorName': 'playername', 'body': 'The match froze', 'createdAt': '2026-10-15T12:00:00.000Z', }, { 'id': 'message-2', 'ticketId': 'ticket-1', 'authorKind': 'staff', 'authorName': 'ada', 'body': 'We are looking into this.', 'createdAt': '2026-10-15T12:10:00.000Z', }, ], }); expect(thread.ticket.isClosed, isTrue); expect(thread.messages, hasLength(2)); expect(thread.messages.first.isStaff, isFalse); expect(thread.messages.last.isStaff, isTrue); }); test('parses a login result', () { final result = LoginResult.fromJson({ 'ok': true, 'token': 'session-token', 'account': { 'id': 'acct', 'username': 'ada', 'isAdmin': false, 'permissions': { 'support': {'read': true, 'write': true}, }, }, }); expect(result.token, 'session-token'); expect(result.account.canWriteSupport, isTrue); }); }