Skip to content

Commit 5a9e8e3

Browse files
authored
Update models and expose new classes (#14)
1 parent bb0eb7e commit 5a9e8e3

File tree

9 files changed

+87
-29
lines changed

9 files changed

+87
-29
lines changed

example/flutter_example/lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class _MyHomePageState extends State<MyHomePage> {
7878
onPressed: () async {
7979
setLoading(true);
8080
try {
81-
final token = await omiseApi.tokens.create(const CreateTokenRequest(
81+
final token = await omiseApi.tokens.create(CreateTokenRequest(
8282
name: "Name",
8383
number: "4242424242424242", // Example test card number
8484
expirationMonth: "09", // Card expiry month

lib/omise_dart.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,5 @@ export 'src/enums/card_brand.dart';
1010
export 'src/enums/payment_method_name.dart';
1111
export 'src/enums/tokenization_method.dart';
1212
export 'src/enums/omise_api_errors.dart';
13+
export 'src/enums/charge_status.dart';
14+
export 'src/exceptions/omise_api_exception.dart';

lib/src/enums/charge_status.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
enum ChargeStatus {
2+
failed,
3+
expired,
4+
pending,
5+
reversed,
6+
successful,
7+
unknown, // when there is no charge attached to the token
8+
}
9+
10+
extension ChargeStatusExtension on ChargeStatus {
11+
static ChargeStatus fromString(String? value) {
12+
return ChargeStatus.values.firstWhere(
13+
(status) => status.name.toLowerCase() == value?.toLowerCase(),
14+
orElse: () => ChargeStatus.unknown,
15+
);
16+
}
17+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
extension DateTimeExtensions on DateTime {
2+
String toIso8601StringWithoutMilliseconds() {
3+
return '${toUtc().toIso8601String().split('.').first}Z';
4+
}
5+
}

lib/src/models/requests/create_token_request.dart

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
class CreateTokenRequest {
2-
final String name;
3-
final String number;
4-
final String expirationMonth;
5-
final String expirationYear;
6-
final String? securityCode;
7-
final String? city;
8-
final String? country;
9-
final String? postalCode;
10-
final String? phoneNumber;
11-
final String? email;
12-
final String? state;
13-
final String? street1;
14-
final String? street2;
2+
String name;
3+
String number;
4+
String expirationMonth;
5+
String expirationYear;
6+
String? securityCode;
7+
String? city;
8+
String? country;
9+
String? postalCode;
10+
String? phoneNumber;
11+
String? email;
12+
String? state;
13+
String? street1;
14+
String? street2;
1515

16-
const CreateTokenRequest({
16+
CreateTokenRequest({
1717
required this.name,
1818
required this.number,
1919
required this.expirationMonth,

lib/src/models/responses/token.dart

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import 'package:omise_dart/src/enums/charge_status.dart';
2+
import 'package:omise_dart/src/extensions/date_time_no_milliseconds.dart';
13
import 'package:omise_dart/src/models/responses/base_response.dart';
24

35
class Token extends BaseResponse {
46
final bool used;
5-
final String chargeStatus;
7+
final ChargeStatus chargeStatus;
68
final Card card;
7-
final String createdAt;
9+
final DateTime createdAt;
810

911
Token({
1012
required super.object,
@@ -25,9 +27,9 @@ class Token extends BaseResponse {
2527
livemode: json['livemode'],
2628
location: json['location'],
2729
used: json['used'],
28-
chargeStatus: json['charge_status'],
30+
chargeStatus: ChargeStatusExtension.fromString(json['charge_status']),
2931
card: Card.fromJson(json['card']),
30-
createdAt: json['created_at'],
32+
createdAt: DateTime.parse(json['created_at']),
3133
);
3234
}
3335

@@ -37,9 +39,9 @@ class Token extends BaseResponse {
3739
final baseJson = super.toJson();
3840
baseJson.addAll({
3941
'used': used,
40-
'charge_status': chargeStatus,
42+
'charge_status': chargeStatus.name,
4143
'card': card.toJson(),
42-
'created_at': createdAt,
44+
'created_at': createdAt.toIso8601StringWithoutMilliseconds(),
4345
});
4446
return baseJson;
4547
}

test/enums/charge_status_test.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import 'package:omise_dart/src/enums/charge_status.dart';
2+
import 'package:test/test.dart';
3+
4+
void main() {
5+
group('ChargeStatusExtension', () {
6+
test('fromString should return the correct ChargeStatus for valid strings',
7+
() {
8+
expect(ChargeStatusExtension.fromString('failed'), ChargeStatus.failed);
9+
expect(ChargeStatusExtension.fromString('expired'), ChargeStatus.expired);
10+
expect(ChargeStatusExtension.fromString('pending'), ChargeStatus.pending);
11+
expect(
12+
ChargeStatusExtension.fromString('reversed'), ChargeStatus.reversed);
13+
expect(ChargeStatusExtension.fromString('successful'),
14+
ChargeStatus.successful);
15+
});
16+
17+
test('fromString should return ChargeStatus.unknown for invalid strings',
18+
() {
19+
expect(ChargeStatusExtension.fromString('nonexistent'),
20+
ChargeStatus.unknown);
21+
expect(ChargeStatusExtension.fromString(null), ChargeStatus.unknown);
22+
expect(ChargeStatusExtension.fromString(''), ChargeStatus.unknown);
23+
});
24+
25+
test('fromString should be case insensitive', () {
26+
expect(ChargeStatusExtension.fromString('FAILED'), ChargeStatus.failed);
27+
expect(ChargeStatusExtension.fromString('Expired'), ChargeStatus.expired);
28+
expect(ChargeStatusExtension.fromString('PeNdInG'), ChargeStatus.pending);
29+
});
30+
});
31+
}

test/models/requests/create_token_request_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'package:omise_dart/src/models/requests/create_token_request.dart';
44
void main() {
55
group('CreateTokenRequest', () {
66
test('toJson should convert CreateTokenRequest to correct map', () {
7-
const request = CreateTokenRequest(
7+
final request = CreateTokenRequest(
88
name: 'John Doe',
99
number: '4242424242424242',
1010
expirationMonth: '12',
@@ -72,7 +72,7 @@ void main() {
7272
});
7373

7474
test('toJson and fromJson should work together', () {
75-
const request = CreateTokenRequest(
75+
final request = CreateTokenRequest(
7676
name: 'John Doe',
7777
number: '4242424242424242',
7878
expirationMonth: '12',

test/models/responses/token_test.dart

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:omise_dart/src/enums/charge_status.dart';
12
import 'package:omise_dart/src/models/responses/token.dart';
23
import 'package:test/test.dart';
34

@@ -24,9 +25,9 @@ void main() {
2425
id: 'tok_123',
2526
livemode: true,
2627
used: false,
27-
chargeStatus: 'pending',
28+
chargeStatus: ChargeStatus.pending,
2829
card: card,
29-
createdAt: '2024-09-15T00:00:00Z',
30+
createdAt: DateTime.parse('2024-09-15T00:00:00Z'),
3031
);
3132

3233
final json = token.toJson();
@@ -70,9 +71,9 @@ void main() {
7071
expect(token.id, 'tok_123');
7172
expect(token.livemode, true);
7273
expect(token.used, false);
73-
expect(token.chargeStatus, 'pending');
74+
expect(token.chargeStatus, ChargeStatus.pending);
7475
expect(token.card.id, 'card_123');
75-
expect(token.createdAt, '2024-09-15T00:00:00Z');
76+
expect(token.createdAt, DateTime.parse('2024-09-15T00:00:00Z'));
7677
});
7778

7879
test('toJson and fromJson should work together', () {
@@ -96,9 +97,9 @@ void main() {
9697
id: 'tok_123',
9798
livemode: true,
9899
used: false,
99-
chargeStatus: 'pending',
100+
chargeStatus: ChargeStatus.pending,
100101
card: card,
101-
createdAt: '2024-09-15T00:00:00Z',
102+
createdAt: DateTime.parse('2024-09-15T00:00:00Z'),
102103
);
103104

104105
final json = token.toJson();

0 commit comments

Comments
 (0)