Skip to content

Commit a722d8c

Browse files
committed
improved tmc-client's public API and added test
1 parent 5bcc12a commit a722d8c

File tree

5 files changed

+72
-35
lines changed

5 files changed

+72
-35
lines changed

tmc-client/src/lib.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,13 @@
1212
//!
1313
1414
mod error;
15-
mod request;
16-
mod response;
15+
pub mod request;
16+
pub mod response;
1717
mod tmc_client;
1818

1919
pub use self::error::ClientError;
20-
pub use self::request::FeedbackAnswer;
21-
pub use self::response::{
22-
Course, CourseData, CourseDataExercise, CourseDataExercisePoint, CourseDetails, CourseExercise,
23-
Exercise, ExerciseDetails, ExercisesDetails, NewSubmission, Organization, Review, Submission,
24-
SubmissionFeedbackResponse, SubmissionFinished, SubmissionProcessingStatus, SubmissionStatus,
25-
User,
26-
};
2720
pub use self::tmc_client::{api_v8, ClientUpdateData, TmcClient, Token, UpdateResult};
21+
22+
// these types are part of tmc-client's API and thus re-exported
2823
pub use oauth2;
29-
pub use tmc_langs_plugins::{Language, RunResult, StyleValidationResult, StyleValidationStrategy};
24+
pub use tmc_langs_plugins::Language;

tmc-client/src/tmc_client.rs

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use self::api_v8::{PasteData, ReviewData};
55
use crate::error::ClientError;
66
use crate::request::*;
77
use crate::response::*;
8-
use crate::Language;
98
use oauth2::{
109
basic::BasicClient, AuthUrl, ClientId, ClientSecret, ResourceOwnerPassword,
1110
ResourceOwnerUsername, TokenUrl,
@@ -19,6 +18,7 @@ use std::thread;
1918
use std::time::Duration;
2019
use std::{collections::HashMap, io::Cursor};
2120
use std::{io::Write, u32};
21+
use tmc_langs_plugins::Language;
2222
use tmc_langs_util::progress_reporter;
2323

2424
/// Authentication token.
@@ -571,17 +571,6 @@ impl TmcClient {
571571
Ok(())
572572
}
573573

574-
/// Checks the status of a submission on the server. May require authentication.
575-
///
576-
/// # Errors
577-
/// If authentication is required but the client is not authenticated, if there's some problem reaching the API, or if the API returns an error.
578-
pub fn check_submission(
579-
&self,
580-
submission_id: u32,
581-
) -> Result<SubmissionProcessingStatus, ClientError> {
582-
api_v8::get_submission(self, submission_id)
583-
}
584-
585574
/// Request code review. Requires authentication.
586575
///
587576
/// # Errors
@@ -596,12 +585,6 @@ impl TmcClient {
596585
}
597586
}
598587

599-
impl AsRef<TmcCore> for TmcClient {
600-
fn as_ref(&self) -> &TmcCore {
601-
&self.0
602-
}
603-
}
604-
605588
fn start_stage(steps: u32, message: impl Into<String>, data: impl Into<Option<ClientUpdateData>>) {
606589
progress_reporter::start_stage(steps, message.into(), data.into())
607590
}
@@ -617,6 +600,9 @@ fn finish_stage(message: impl Into<String>, data: impl Into<Option<ClientUpdateD
617600
#[cfg(test)]
618601
#[allow(clippy::clippy::unwrap_used)]
619602
mod test {
603+
use std::sync::atomic::AtomicBool;
604+
605+
// many of TmcClient's functions simply call already tested functions from api_v8 and don't need testing
620606
use super::*;
621607
use mockito::Matcher;
622608
use oauth2::{basic::BasicTokenType, AccessToken, EmptyExtraTokenFields};
@@ -760,4 +746,57 @@ mod test {
760746
assert_eq!(update_result.updated.len(), 1);
761747
assert_eq!(update_result.updated[0].checksum, "zz");
762748
}
749+
750+
#[test]
751+
fn waits_for_submission() {
752+
init();
753+
754+
let client = make_client();
755+
let m = mockito::mock("GET", "/api/v8/core/submission/0")
756+
.match_query(Matcher::AllOf(vec![
757+
Matcher::UrlEncoded("client".into(), "some_client".into()),
758+
Matcher::UrlEncoded("client_version".into(), "some_ver".into()),
759+
]))
760+
.with_body_from_fn(|w| {
761+
static CALLED: AtomicBool = AtomicBool::new(false);
762+
if !CALLED.load(std::sync::atomic::Ordering::SeqCst) {
763+
CALLED.store(true, std::sync::atomic::Ordering::SeqCst);
764+
w.write_all(
765+
br#"
766+
{
767+
"status": "processing",
768+
"sandbox_status": "created"
769+
}
770+
"#,
771+
)
772+
.unwrap();
773+
} else {
774+
w.write_all(
775+
br#"
776+
{
777+
"api_version": 0,
778+
"user_id": 1,
779+
"login": "",
780+
"course": "",
781+
"exercise_name": "",
782+
"status": "processing",
783+
"points": [],
784+
"submission_url": "",
785+
"submitted_at": "",
786+
"reviewed": false,
787+
"requests_review": false,
788+
"missing_review_points": []
789+
}
790+
"#,
791+
)
792+
.unwrap();
793+
}
794+
Ok(())
795+
})
796+
.expect(2)
797+
.create();
798+
799+
let _res = client.wait_for_submission(0).unwrap();
800+
m.assert();
801+
}
763802
}

tmc-client/tests/api_integration.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use dotenv::dotenv;
22
use std::{env, io::Read};
3-
use tmc_client::{api_v8, FeedbackAnswer, TmcClient};
3+
use tmc_client::{api_v8, request::FeedbackAnswer, TmcClient};
44

55
const ORGANIZATION_SLUG: &str = "hy";
66
const COURSE_NAME: &str = "java-1-f2020";

tmc-langs/src/data.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use schemars::JsonSchema;
44
use serde::Serialize;
55
use std::fmt::{Display, Formatter, Result as FmtResult};
66
use std::{collections::HashMap, path::PathBuf};
7-
use tmc_client::{CourseData, CourseDetails, CourseExercise};
7+
use tmc_client::response::{CourseData, CourseDetails, CourseExercise};
88

99
use crate::error::{LangsError, ParamError};
1010

tmc-langs/src/lib.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@ use hmac::{Hmac, NewMac};
2626
use serde::Serialize;
2727
use sha2::Sha256;
2828
pub use tmc_client::{
29-
ClientError, ClientUpdateData, Course, CourseData, CourseDetails, CourseExercise,
30-
ExerciseDetails, FeedbackAnswer, NewSubmission, Organization, Review, RunResult,
31-
StyleValidationResult, Submission, SubmissionFeedbackResponse, SubmissionFinished, TmcClient,
32-
Token, UpdateResult,
29+
request::FeedbackAnswer,
30+
response::{
31+
Course, CourseData, CourseDetails, CourseExercise, ExerciseDetails, NewSubmission,
32+
Organization, Review, Submission, SubmissionFeedbackResponse, SubmissionFinished,
33+
},
34+
ClientError, ClientUpdateData, TmcClient, Token, UpdateResult,
3335
};
3436
pub use tmc_langs_framework::{
3537
CommandError, ExerciseDesc, ExercisePackagingConfiguration, Language, LanguagePlugin,
38+
RunResult, StyleValidationResult,
3639
};
3740
pub use tmc_langs_util::{
3841
file_util::{self, FileLockGuard},
@@ -1003,7 +1006,7 @@ fn extract_project_overwrite(
10031006
#[allow(clippy::clippy::unwrap_used)]
10041007
mod test {
10051008
use std::io::Write;
1006-
use tmc_client::ExercisesDetails;
1009+
use tmc_client::response::ExercisesDetails;
10071010

10081011
use super::*;
10091012

0 commit comments

Comments
 (0)