mirror of
https://github.com/SkinnyMind/libgit2dart.git
synced 2025-05-04 20:29:08 -04:00
feat(repository): add ability to pass credentials in callbacks argument
This commit is contained in:
parent
299d1a17e7
commit
4c7a096fe3
31 changed files with 1340 additions and 308 deletions
39
test/assets/keys/id_rsa
Normal file
39
test/assets/keys/id_rsa
Normal file
|
@ -0,0 +1,39 @@
|
|||
-----BEGIN OPENSSH PRIVATE KEY-----
|
||||
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
|
||||
z5AMR0EutUSCby7+DKyBmaYSq0s=
|
||||
-----END OPENSSH PRIVATE KEY-----
|
1
test/assets/keys/id_rsa.pub
Normal file
1
test/assets/keys/id_rsa.pub
Normal file
|
@ -0,0 +1 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC5bu0UuVdGeimAo2mu87uy/hWCbvie6N8H4a7ZjnSThpDIv0clcnbycCukDb/d8o9FRIPNNp2astBlWpnZ9vCHByP8z8ITO/pG5Mu0Wp0n1Hrja5UVdk4cBvvoEcr2sdNqj3wUUhqeAnNCYeeJuW9Vj2JNV2wwJYPAZBDi6GJTM9FPlCJz+QA6dJLkUiIwngrL8bSPzXd+1mzHOrIcqjxKm8J+ed3tVSlRq7YvefrACUOTI9ymXwYr8a/TiwA76nTHvNPYIhmzH8PEF65QsFTs/qk0nqSwmqKAvineapBMmrb3Vf/Hd/c0nEMgHt6gy/+dtlgPh1bTqaQaS/oeo5OtjMDK/w93SR9M3UZBX+eeMUGfyhvYT4Nvo3TumKzaZ6peGu1T0MKprSwgRdI+v1q+58sKfzSK5QevTpKiX1+4Leo6BiNKKu6doD19fgNSD/dwfOWehxFtD8q/1J5k0QPgqslFkqyZJXRCzzowRYunSN+AaHVD3Wo4AuqtfTiazPM= libgit2dart
|
170
test/credentials_test.dart
Normal file
170
test/credentials_test.dart
Normal file
|
@ -0,0 +1,170 @@
|
|||
import 'dart:io';
|
||||
import 'package:test/test.dart';
|
||||
import 'package:libgit2dart/libgit2dart.dart';
|
||||
|
||||
void main() {
|
||||
final cloneDir = Directory('${Directory.systemTemp.path}/credentials_cloned');
|
||||
|
||||
setUp(() async {
|
||||
if (await cloneDir.exists()) {
|
||||
cloneDir.delete(recursive: true);
|
||||
}
|
||||
});
|
||||
|
||||
tearDown(() async {
|
||||
if (await cloneDir.exists()) {
|
||||
cloneDir.delete(recursive: true);
|
||||
}
|
||||
});
|
||||
group('Credentials', () {
|
||||
test('successfully initializes username credentials', () {
|
||||
final credentials = const Username('user');
|
||||
|
||||
expect(credentials, isA<Credentials>());
|
||||
expect(credentials.username, 'user');
|
||||
expect(credentials.credentialType, GitCredential.username);
|
||||
});
|
||||
|
||||
test('successfully initializes username/password credentials', () {
|
||||
final credentials = const UserPass(
|
||||
username: 'user',
|
||||
password: 'password',
|
||||
);
|
||||
|
||||
expect(credentials, isA<Credentials>());
|
||||
expect(credentials.username, 'user');
|
||||
expect(credentials.password, 'password');
|
||||
expect(credentials.credentialType, GitCredential.userPassPlainText);
|
||||
});
|
||||
|
||||
test('successfully initializes keypair credentials', () {
|
||||
final credentials = const Keypair(
|
||||
username: 'user',
|
||||
pubKey: 'id_rsa.pub',
|
||||
privateKey: 'id_rsa',
|
||||
passPhrase: 'passphrase',
|
||||
);
|
||||
|
||||
expect(credentials, isA<Credentials>());
|
||||
expect(credentials.username, 'user');
|
||||
expect(credentials.pubKey, 'id_rsa.pub');
|
||||
expect(credentials.privateKey, 'id_rsa');
|
||||
expect(credentials.passPhrase, 'passphrase');
|
||||
expect(credentials.credentialType, GitCredential.sshKey);
|
||||
});
|
||||
|
||||
test('successfully initializes keypair from memory credentials', () {
|
||||
final credentials = const KeypairFromMemory(
|
||||
username: 'user',
|
||||
pubKey: 'pubkey data',
|
||||
privateKey: 'private key data',
|
||||
passPhrase: 'passphrase',
|
||||
);
|
||||
|
||||
expect(credentials, isA<Credentials>());
|
||||
expect(credentials.username, 'user');
|
||||
expect(credentials.pubKey, 'pubkey data');
|
||||
expect(credentials.privateKey, 'private key data');
|
||||
expect(credentials.passPhrase, 'passphrase');
|
||||
expect(credentials.credentialType, GitCredential.sshMemory);
|
||||
});
|
||||
|
||||
test('successfully initializes keypair from agent credentials', () {
|
||||
final credentials = const KeypairFromAgent('user');
|
||||
|
||||
expect(credentials, isA<Credentials>());
|
||||
expect(credentials.username, 'user');
|
||||
expect(credentials.credentialType, GitCredential.sshKey);
|
||||
});
|
||||
|
||||
test('sucessfully clones repository with provided keypair', () {
|
||||
final keypair = const Keypair(
|
||||
username: 'git',
|
||||
pubKey: 'test/assets/keys/id_rsa.pub',
|
||||
privateKey: 'test/assets/keys/id_rsa',
|
||||
passPhrase: 'empty',
|
||||
);
|
||||
final callbacks = Callbacks(credentials: keypair);
|
||||
|
||||
final repo = Repository.clone(
|
||||
url: 'ssh://git@github.com/libgit2/TestGitRepository',
|
||||
localPath: cloneDir.path,
|
||||
callbacks: callbacks,
|
||||
);
|
||||
|
||||
expect(repo.isEmpty, false);
|
||||
|
||||
repo.free();
|
||||
});
|
||||
|
||||
test('throws when no credentials is provided', () {
|
||||
expect(
|
||||
() => Repository.clone(
|
||||
url: 'ssh://git@github.com/libgit2/TestGitRepository',
|
||||
localPath: cloneDir.path,
|
||||
),
|
||||
throwsA(isA<LibGit2Error>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('throws when provided keypair is invalid', () {
|
||||
final keypair = const Keypair(
|
||||
username: 'git',
|
||||
pubKey: 'invalid.pub',
|
||||
privateKey: 'invalid',
|
||||
passPhrase: 'invalid',
|
||||
);
|
||||
final callbacks = Callbacks(credentials: keypair);
|
||||
|
||||
expect(
|
||||
() => Repository.clone(
|
||||
url: 'ssh://git@github.com/libgit2/TestGitRepository',
|
||||
localPath: cloneDir.path,
|
||||
callbacks: callbacks,
|
||||
),
|
||||
throwsA(isA<LibGit2Error>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('sucessfully clones repository with provided keypair from memory', () {
|
||||
final pubKey = File('test/assets/keys/id_rsa.pub').readAsStringSync();
|
||||
final privateKey = File('test/assets/keys/id_rsa').readAsStringSync();
|
||||
final keypair = KeypairFromMemory(
|
||||
username: 'git',
|
||||
pubKey: pubKey,
|
||||
privateKey: privateKey,
|
||||
passPhrase: 'empty',
|
||||
);
|
||||
final callbacks = Callbacks(credentials: keypair);
|
||||
|
||||
final repo = Repository.clone(
|
||||
url: 'ssh://git@github.com/libgit2/TestGitRepository',
|
||||
localPath: cloneDir.path,
|
||||
callbacks: callbacks,
|
||||
);
|
||||
|
||||
expect(repo.isEmpty, false);
|
||||
|
||||
repo.free();
|
||||
});
|
||||
|
||||
test('sucessfully clones repository with provided username and password',
|
||||
() {
|
||||
final userPass = const UserPass(
|
||||
username: 'libgit2',
|
||||
password: 'libgit2',
|
||||
);
|
||||
final callbacks = Callbacks(credentials: userPass);
|
||||
|
||||
final repo = Repository.clone(
|
||||
url: 'https://github.com/libgit2/TestGitRepository',
|
||||
localPath: cloneDir.path,
|
||||
callbacks: callbacks,
|
||||
);
|
||||
|
||||
expect(repo.isEmpty, false);
|
||||
|
||||
repo.free();
|
||||
});
|
||||
});
|
||||
}
|
14
test/features_test.dart
Normal file
14
test/features_test.dart
Normal file
|
@ -0,0 +1,14 @@
|
|||
import 'package:libgit2dart/src/features.dart';
|
||||
import 'package:test/test.dart';
|
||||
import 'package:libgit2dart/libgit2dart.dart';
|
||||
|
||||
void main() {
|
||||
group('Features', () {
|
||||
test('returns list of compile time options for libgit2', () {
|
||||
expect(
|
||||
Features.list,
|
||||
[GitFeature.threads, GitFeature.https, GitFeature.ssh, GitFeature.nsec],
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue