What to do?
UserService를 만들고, Test 코드 작성하기
Reference
아래 영상을 따라서 만들어보았다.
개발환경 세팅하기
지난번 포스팅으로 대체한다.
[Flutter] 개발환경 세팅하기
Install Flutter flutter 홈페이지에서 flutter 다운로드 다운로드 받은 파일의 압축을 풀기 압축을 풀면 bin파일이 있는데, 이후 해당 파일 경로를 환경변수에 등록해야 함 시스템 환경변수 편집에 들어
sddkarma.tistory.com
pubspec.yaml
pubspec.yaml파일에서 아래 코드를 수정
- null-safety 관련해서 문법 오류가 발생해서 sdk 버전을 수정
- rethinkdb 라이브러리를 사용하기 위해 dependencies 코드 수정
environment:
sdk: ">=2.7.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
rethinkdb_dart: ^2.3.2+6
User
model/user.dart
class User {
// getter
String get id => _id;
// field
String _id;
String username;
String photoUrl;
bool active;
DateTime lastSeen;
// constructor
User({
@required this.username,
@required this.photoUrl,
@required this.active,
@required this.lastSeen,
});
// class → json
toJson()=>{
'username':username,
'photo_url':photoUrl,
'active':active,
'last_seen':lastSeen,
};
// json → class
factory User.fromJson(Map<String, dynamic> json){
final user = User(
username: json['username'],
photoUrl: json['photo_url'],
active: json['active'],
lastSeen: json['last_seen']
);
user._id = json['id'];
return user;
}
}
UserService
service/user_service_interface.dart
- connect : 유저가 채팅 서비스에 접속
- online : 현재 접속중인 유저 리스트 반환
- disconnect : 유저가 채팅서비스에서 나감
abstract class IUserService {
Future<User> connect(User user);
Future<List<User>> online();
Future<void> disconnect(User user);
}
service/user_serivce.dart
- 위에서 만든 class를 implement
- connect : 유저를 데이터베이스 추가
- disconnect : 유저의 active 필드를 false로 변경 후, connection 종료
- online : active 필드가 true인 user list 반환
class UserService implements IUserService {
final Rethinkdb _db;
final Connection _connection;
UserService(this._db, this._connection);
@override
Future<User> connect(User user) async {
var data = user.toJson();
if (user.id != null) data['id'] = user.id;
final result = await _db.table('users').insert(data, {
'conflict': 'update',
'return_changes': true,
}).run(_connection);
return User.fromJson(result['changes'].first['new_val']);
}
@override
Future<void> disconnect(User user) async {
await _db.table('user').update({'id':user.id, 'active':false, 'last_seen':DateTime.now()}).run(_connection);
_connection.close();
}
@override
Future<List<User>> online() async {
Cursor cursor = await _db.table('users').filter({'active':true}).run(_connection);
final users = await cursor.toList();
return users.map((u)=>User.fromJson(u)).toList();
}
}
Test
test/helper.dart
- createDatabase
- test라는 데이터베이스 생성
- users라는 테이블 생성
- cleanDatabase
- users라는 테이블 제거
Future<void> createDatabase(Rethinkdb db, Connection connection) async{
await db.dbCreate('test').run(connection).catchError((err)=>{});
await db.tableCreate('users').run(connection).catchError((err)=>{});
}
Future<void> cleanDatabase(Rethinkdb db, Connection connection) async{
await db.table('users').delete().run(connection);
}
void main(){
Rethinkdb _db = Rethinkdb();
Connection _connection;
UserService sut;
setUp(() async {
_connection = await _db.connect(host:"127.0.0.1", port: 28015);
await createDatabase(_db, _connection);
sut = UserService(_db, _connection);
});
tearDown(() async {
await cleanDatabase(_db, _connection);
});
test('create new user and its id is not empty', () async {
final user = User(
username:'test username',
photoUrl: 'test photo url',
active: true,
lastSeen: DateTime.now()
);
final userWithId = await sut.connect(user);
expect(userWithId.id, isNotEmpty);
});
}
Docker Container
- Docker Desktop을 설치
- Docker Container 삭제
docker container prune
- Docker rethinkdb Container 실행
docker run -d -p 8080:8080 -p 28015:28015 rethinkdb
- 현재 실행중인 컨테이너 출력
docker ps
rethink db 컨테이너가 잘 떠 있으면, 브라우져에서 127.0.0.1:8080로 접속하면 다음과 같은 대쉬보드가 나온다.
테스트는 성공적으로 된다.
'Flutter' 카테고리의 다른 글
[Flutter] 채팅앱 만들기 #5 (0) | 2023.03.04 |
---|---|
[Flutter] 채팅앱 만들기 #4 (0) | 2023.03.01 |
[Flutter] 채팅앱 만들기 #3 (0) | 2023.03.01 |
[Flutter] 채팅앱 만들기 #2 (0) | 2023.03.01 |
[Flutter] 개발환경 세팅하기 (0) | 2023.02.25 |