import 'package:test/test.dart';
import 'package:platform_cookie/src/cookie_jar.dart';

void main() {
  group('CookieJar', () {
    late CookieJar cookieJar;

    setUp(() {
      cookieJar = CookieJar();
    });

    test('make creates a cookie with default values', () {
      final cookie = cookieJar.make('name', 'value');
      expect(cookie['name'], equals('name'));
      expect(cookie['value'], equals('value'));
      expect(cookie['path'], equals('/'));
      expect(cookie['secure'], equals('false'));
      expect(cookie['httponly'], equals('true'));
    });

    test('make creates a cookie with custom values', () {
      final cookie = cookieJar.make('name', 'value',
          domain: 'example.com',
          path: '/custom',
          secure: true,
          httpOnly: false,
          sameSite: 'Strict');
      expect(cookie['name'], equals('name'));
      expect(cookie['value'], equals('value'));
      expect(cookie['domain'], equals('example.com'));
      expect(cookie['path'], equals('/custom'));
      expect(cookie['secure'], equals('true'));
      expect(cookie['httponly'], equals('false'));
      expect(cookie['samesite'], equals('Strict'));
    });

    test('queue adds a cookie to the queue', () {
      cookieJar.queue('name', 'value');
      expect(cookieJar.hasQueued('name'), isTrue);
    });

    test('unqueue removes a cookie from the queue', () {
      cookieJar.queue('name', 'value');
      cookieJar.unqueue('name');
      expect(cookieJar.hasQueued('name'), isFalse);
    });

    test('getQueuedCookies returns all queued cookies', () {
      cookieJar.queue('name1', 'value1');
      cookieJar.queue('name2', 'value2');
      final queuedCookies = cookieJar.getQueuedCookies();
      expect(queuedCookies.length, equals(2));
      expect(queuedCookies['name1']?['value'], equals('value1'));
      expect(queuedCookies['name2']?['value'], equals('value2'));
    });

    test('make encodes value when raw is false', () {
      final cookie = cookieJar.make('name', 'value with spaces');
      expect(cookie['value'], equals('value%20with%20spaces'));
    });

    test('make does not encode value when raw is true', () {
      final cookie = cookieJar.make('name', 'value with spaces', raw: true);
      expect(cookie['value'], equals('value with spaces'));
    });

    test('make sets expiration time when minutes are provided', () {
      final cookie = cookieJar.make('name', 'value', minutes: 30);
      expect(cookie['expires'], isNotEmpty);
    });
  });
}
