Skip to content

Commit

Permalink
feat: parse ODRS errors (#14)
Browse files Browse the repository at this point in the history
Close: #13
  • Loading branch information
jpnurmi committed Jun 5, 2023
1 parent cc42c5d commit 53044d0
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lib/src/client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ class OdrsClient {
} on FormatException catch (e) {
// TODO: https://github.com/ubuntu-flutter-community/odrs.dart/issues/1
// print(data);
throw OdrsException('Invalid response: ${e.message}');
throw OdrsException(e.message);
}
}
}
60 changes: 59 additions & 1 deletion lib/src/exception.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,64 @@
enum OdrsError {
invalidString,
accountDisabled,
negativeKarma,
alreadyReviewed,
alreadyVoted,
longDescription,
shortDescription,
invalidData,
invalidReviewId,
invalidUserSkey,
missingData,
noReview,
noUser,
tabooWord,
longSummary,
shortSummary,
invalidAppId,
invalidUserHash,
unknown,
}

class OdrsException implements Exception {
const OdrsException(this.message);
const OdrsException._(this.error, this.message);

factory OdrsException(String message) {
OdrsError parse(String message) {
if (message.endsWith(' is not a valid string')) {
return OdrsError.invalidString;
} else if (message.startsWith('invalid data, expected ')) {
return OdrsError.invalidData;
} else if (message.startsWith('missing data, expected ')) {
return OdrsError.missingData;
} else if (message.startsWith('no user for ')) {
return OdrsError.noUser;
} else {
return OdrsError.unknown;
}
}

final error = switch (message) {
'account has been disabled due to abuse' => OdrsError.accountDisabled,
'all negative karma used up' => OdrsError.negativeKarma,
'already reviewed this app' => OdrsError.alreadyReviewed,
'already voted on this app' => OdrsError.alreadyVoted,
'description is too long' => OdrsError.longDescription,
'description is too short' => OdrsError.shortDescription,
'invalid review ID' => OdrsError.invalidReviewId,
'invalid user_skey' => OdrsError.invalidUserSkey,
'no review' => OdrsError.noReview,
'review contains taboo word' => OdrsError.tabooWord,
'summary is too long' => OdrsError.longSummary,
'summary is too short' => OdrsError.shortSummary,
'the app_id is invalid' => OdrsError.invalidAppId,
'the user_hash is invalid' => OdrsError.invalidUserHash,
_ => parse(message),
};
return OdrsException._(error, message);
}

final OdrsError error;
final String message;

@override
Expand Down
83 changes: 83 additions & 0 deletions test/odrs_exception_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import 'package:odrs/odrs.dart';
import 'package:test/test.dart';

void main() {
test('odrs errors', () {
expect(
OdrsException('account has been disabled due to abuse').error,
OdrsError.accountDisabled,
);
expect(
OdrsException('all negative karma used up').error,
OdrsError.negativeKarma,
);
expect(
OdrsException('already reviewed this app').error,
OdrsError.alreadyReviewed,
);
expect(
OdrsException('already voted on this app').error,
OdrsError.alreadyVoted,
);
expect(
OdrsException('description is too long').error,
OdrsError.longDescription,
);
expect(
OdrsException('description is too short').error,
OdrsError.shortDescription,
);
expect(
OdrsException('invalid review ID').error,
OdrsError.invalidReviewId,
);
expect(
OdrsException('invalid user_skey').error,
OdrsError.invalidUserSkey,
);
expect(
OdrsException('no review').error,
OdrsError.noReview,
);
expect(
OdrsException('review contains taboo word').error,
OdrsError.tabooWord,
);
expect(
OdrsException('summary is too long').error,
OdrsError.longSummary,
);
expect(
OdrsException('summary is too short').error,
OdrsError.shortSummary,
);
expect(
OdrsException('the app_id is invalid').error,
OdrsError.invalidAppId,
);
expect(
OdrsException('the user_hash is invalid').error,
OdrsError.invalidUserHash,
);
expect(
OdrsException('foo is not a valid string').error,
OdrsError.invalidString,
);
expect(
OdrsException('invalid data, expected foo').error,
OdrsError.invalidData,
);
expect(
OdrsException('missing data, expected foo').error,
OdrsError.missingData,
);
expect(
OdrsException('no user for foo').error,
OdrsError.noUser,
);
expect(
OdrsException('foo').error,
OdrsError.unknown,
);
});
}

0 comments on commit 53044d0

Please sign in to comment.