// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:convert';

import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf_test_handler/shelf_test_handler.dart';
import 'package:test/test.dart';

import '../descriptor.dart' as d;
import '../test_pub.dart';

main() {
  test(
      'with an expired credentials.json, refreshes and saves the '
      'refreshed access token to credentials.json', () async {
    await d.validPackage.create();

    var server = await ShelfTestServer.create();
    await d
        .credentialsFile(server, 'access token',
            refreshToken: 'refresh token',
            expiration: DateTime.now().subtract(Duration(hours: 1)))
        .create();

    var pub = await startPublish(server);
    await confirmPublish(pub);

    server.handler.expect('POST', '/token', (request) {
      return request.readAsString().then((body) {
        expect(
            body, matches(RegExp(r'(^|&)refresh_token=refresh\+token(&|$)')));

        return shelf.Response.ok(
            jsonEncode(
                {"access_token": "new access token", "token_type": "bearer"}),
            headers: {'content-type': 'application/json'});
      });
    });

    server.handler.expect('GET', '/api/packages/versions/new', (request) {
      expect(request.headers,
          containsPair('authorization', 'Bearer new access token'));

      return shelf.Response(200);
    });

    await pub.shouldExit();

    await d
        .credentialsFile(server, 'new access token',
            refreshToken: 'refresh token')
        .validate();
  });
}
