diff --git a/migrations/2020-12-07-131734_unique_rtc_per_room/down.sql b/migrations/2020-12-07-131734_unique_rtc_per_room/down.sql new file mode 100644 index 00000000..22731a0b --- /dev/null +++ b/migrations/2020-12-07-131734_unique_rtc_per_room/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS rtc_unique_room_id; diff --git a/migrations/2020-12-07-131734_unique_rtc_per_room/up.sql b/migrations/2020-12-07-131734_unique_rtc_per_room/up.sql new file mode 100644 index 00000000..9b7f85f8 --- /dev/null +++ b/migrations/2020-12-07-131734_unique_rtc_per_room/up.sql @@ -0,0 +1 @@ +CREATE UNIQUE INDEX rtc_unique_room_id ON rtc (room_id); diff --git a/src/app/endpoint/rtc.rs b/src/app/endpoint/rtc.rs index c8caad81..ab537bf7 100644 --- a/src/app/endpoint/rtc.rs +++ b/src/app/endpoint/rtc.rs @@ -527,6 +527,50 @@ mod test { }); } + #[test] + fn create_rtc_duplicate() { + async_std::task::block_on(async { + let db = TestDb::new(); + let mut authz = TestAuthz::new(); + + // Insert a room. + let room = db + .connection_pool() + .get() + .map(|conn| shared_helpers::insert_room(&conn)) + .unwrap(); + + // Allow user to create rtcs in the room. + let agent = TestAgent::new("web", "user123", USR_AUDIENCE); + let room_id = room.id().to_string(); + let object = vec!["rooms", &room_id, "rtcs"]; + authz.allow(agent.account_id(), object, "create"); + + // Make rtc.create request. + let mut context = TestContext::new(db, authz); + let payload = CreateRequest { room_id: room.id() }; + + let messages = handle_request::(&mut context, &agent, payload) + .await + .expect("Rtc creation failed"); + + // Assert response. + let (rtc, respp) = find_response::(messages.as_slice()); + assert_eq!(respp.status(), ResponseStatus::CREATED); + assert_eq!(rtc.room_id(), room.id()); + + // Make rtc.create request second time. + let payload = CreateRequest { room_id: room.id() }; + let err = handle_request::(&mut context, &agent, payload) + .await + .expect_err("Unexpected success on rtc creation"); + + // This should fail with already exists + assert_eq!(err.status(), ResponseStatus::UNPROCESSABLE_ENTITY); + assert_eq!(err.kind(), "database_query_failed"); + }); + } + #[test] fn create_rtc_unauthorized() { async_std::task::block_on(async {