Skip to content
This repository was archived by the owner on Jun 3, 2025. It is now read-only.

Commit ce5b5b3

Browse files
author
mikkomaa
authored
Merge pull request #361 from tmc-cli/ask-only-password-in-courses-aleksi
Get the username and server from course info in login.
2 parents 1cd105b + c3d84ef commit ce5b5b3

File tree

4 files changed

+117
-26
lines changed

4 files changed

+117
-26
lines changed

src/main/java/fi/helsinki/cs/tmc/cli/command/LoginCommand.java

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import fi.helsinki.cs.tmc.cli.command.core.AbstractCommand;
55
import fi.helsinki.cs.tmc.cli.command.core.Command;
66
import fi.helsinki.cs.tmc.cli.io.Io;
7+
import fi.helsinki.cs.tmc.cli.tmcstuff.CourseInfo;
78
import fi.helsinki.cs.tmc.cli.tmcstuff.Settings;
89
import fi.helsinki.cs.tmc.cli.tmcstuff.SettingsIo;
910
import fi.helsinki.cs.tmc.cli.tmcstuff.TmcUtil;
@@ -17,6 +18,10 @@ public class LoginCommand extends AbstractCommand {
1718
private CliContext ctx;
1819
private Io io;
1920

21+
private String serverAddress;
22+
private String username;
23+
private String password;
24+
2025
@Override
2126
public void getOptions(Options options) {
2227
options.addOption("u", "user", true, "TMC username");
@@ -28,37 +33,47 @@ public void getOptions(Options options) {
2833
public void run(CommandLine args, Io io) {
2934
this.ctx = getContext();
3035
this.io = io;
31-
String serverAddress = getLoginInfo(args, "s", "server address: ");
32-
String username = getLoginInfo(args, "u", "username: ");
33-
String password = getLoginInfo(args, "p", "password: ");
3436

3537
if (!ctx.loadBackendWithoutLogin()) {
3638
return;
3739
}
3840

41+
CourseInfo info = ctx.getCourseInfo();
42+
if (info != null) {
43+
serverAddress = info.getServerAddress();
44+
username = info.getUsername();
45+
}
46+
47+
serverAddress = getLoginInfo(args, serverAddress, "s", "server address: ");
48+
username = getLoginInfo(args, username, "u", "username: ");
49+
password = getLoginInfo(args, null, "p", "password: ");
50+
3951
//TODO don't create new settings object.
4052
Settings settings = new Settings(serverAddress, username, password);
41-
if (TmcUtil.tryToLogin(ctx, settings) && saveLoginSettings(settings)) {
42-
io.println("Login successful.");
53+
if (!TmcUtil.tryToLogin(ctx, settings)) {
54+
return;
4355
}
56+
if (!SettingsIo.save(settings)) {
57+
io.println("Failed to write the accounts file.");
58+
return;
59+
}
60+
61+
io.println("Login successful.");
4462
}
4563

46-
private String getLoginInfo(CommandLine line, String option, String prompt) {
47-
String info = line.getOptionValue(option);
48-
if (info == null && option.equals("p")) {
49-
info = io.readPassword(prompt);
50-
} else if (info == null) {
51-
info = io.readLine(prompt);
64+
private String getLoginInfo(CommandLine line, String oldValue, String option,
65+
String prompt) {
66+
String value = oldValue;
67+
68+
if (line.hasOption(option)) {
69+
value = line.getOptionValue(option);
5270
}
53-
return info;
54-
}
5571

56-
private boolean saveLoginSettings(Settings settings) {
57-
if (SettingsIo.save(settings)) {
58-
return true;
59-
} else {
60-
io.println("Login failed.");
61-
return false;
72+
if (value == null && option.equals("p")) {
73+
value = io.readPassword(prompt);
74+
} else if (value == null) {
75+
value = io.readLine(prompt);
6276
}
77+
return value;
6378
}
6479
}

src/main/java/fi/helsinki/cs/tmc/cli/tmcstuff/Settings.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,24 @@ public void setWorkDir(WorkDir workDir) {
4141
this.workDir = workDir;
4242
}
4343

44+
public static boolean stringEquals(String str1, String str2) {
45+
return (str1 == null ? str2 == null : str1.equals(str2));
46+
}
47+
48+
@Override
49+
public boolean equals(Object obj) {
50+
if (obj == null) {
51+
return false;
52+
}
53+
if (!(obj instanceof Settings)) {
54+
return false;
55+
}
56+
Settings another = (Settings)obj;
57+
return stringEquals(this.serverAddress, another.serverAddress)
58+
&& stringEquals(this.username, another.username)
59+
&& stringEquals(this.password, another.password);
60+
}
61+
4462
@Override
4563
public String getServerAddress() {
4664
return serverAddress;

src/test/java/fi/helsinki/cs/tmc/cli/command/LoginCommandTest.java

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,26 @@
22

33
import static org.mockito.Matchers.any;
44
import static org.mockito.Matchers.eq;
5-
import static org.mockito.Mockito.doNothing;
65
import static org.mockito.Mockito.mock;
76
import static org.mockito.Mockito.spy;
87
import static org.mockito.Mockito.when;
98
import static org.powermock.api.mockito.PowerMockito.mockStatic;
9+
import static org.powermock.api.mockito.PowerMockito.verifyStatic;
1010

1111
import fi.helsinki.cs.tmc.cli.Application;
1212
import fi.helsinki.cs.tmc.cli.CliContext;
1313
import fi.helsinki.cs.tmc.cli.io.TestIo;
14+
import fi.helsinki.cs.tmc.cli.tmcstuff.CourseInfo;
1415
import fi.helsinki.cs.tmc.cli.tmcstuff.Settings;
1516
import fi.helsinki.cs.tmc.cli.tmcstuff.SettingsIo;
1617
import fi.helsinki.cs.tmc.cli.tmcstuff.TmcUtil;
1718
import fi.helsinki.cs.tmc.core.TmcCore;
19+
import fi.helsinki.cs.tmc.core.configuration.TmcSettings;
1820

1921
import org.junit.Before;
2022
import org.junit.Test;
2123
import org.junit.runner.RunWith;
24+
2225
import org.powermock.core.classloader.annotations.PrepareForTest;
2326
import org.powermock.modules.junit4.PowerMockRunner;
2427

@@ -49,7 +52,17 @@ public void setUp() {
4952
}
5053

5154
@Test
52-
public void logsInWithCorrectServerUserAndPassword() throws Exception {
55+
public void failIfBackendFails() {
56+
app = new Application(ctx);
57+
when(ctx.loadBackendWithoutLogin()).thenReturn(false);
58+
59+
String[] args = {"login", "-s", SERVER, "-u", USERNAME, "-p", PASSWORD};
60+
app.run(args);
61+
io.assertNotContains("Login successful");
62+
}
63+
64+
@Test
65+
public void logsInWithCorrectServerUserAndPassword() {
5366
when(TmcUtil.tryToLogin(eq(ctx), any(Settings.class))).thenReturn(true);
5467
when(SettingsIo.save(any(Settings.class))).thenReturn(true);
5568
String[] args = {"login", "-s", SERVER, "-u", USERNAME, "-p", PASSWORD};
@@ -58,16 +71,16 @@ public void logsInWithCorrectServerUserAndPassword() throws Exception {
5871
}
5972

6073
@Test
61-
public void userGetsErrorMessageIfLoginFails() throws Exception {
74+
public void userGetsErrorMessageIfLoginFails() {
6275
when(TmcUtil.tryToLogin(eq(ctx), any(Settings.class))).thenReturn(true);
6376
when(SettingsIo.save(any(Settings.class))).thenReturn(false);
6477
String[] args = {"login", "-s", SERVER, "-u", USERNAME, "-p", "WrongPassword"};
6578
app.run(args);
66-
io.assertContains("Login failed.");
79+
io.assertContains("Failed to write the accounts file.");
6780
}
6881

6982
@Test
70-
public void loginAsksUsernameFromUserIfNotGiven() throws Exception {
83+
public void loginAsksUsernameFromUserIfNotGiven() {
7184
when(TmcUtil.tryToLogin(eq(ctx), any(Settings.class))).thenReturn(true);
7285
String[] args = {"login", "-s", SERVER, "-p", PASSWORD};
7386
io.addLinePrompt(USERNAME);
@@ -76,7 +89,7 @@ public void loginAsksUsernameFromUserIfNotGiven() throws Exception {
7689
}
7790

7891
@Test
79-
public void loginAsksPasswordFromUserIfNotGiven() throws Exception {
92+
public void loginAsksPasswordFromUserIfNotGiven() {
8093
when(TmcUtil.tryToLogin(eq(ctx), any(Settings.class))).thenReturn(true);
8194
String[] args = {"login", "-s", SERVER, "-u", USERNAME};
8295
io.addPasswordPrompt(PASSWORD);
@@ -85,11 +98,38 @@ public void loginAsksPasswordFromUserIfNotGiven() throws Exception {
8598
}
8699

87100
@Test
88-
public void loginAsksServerFromUserIfNotGiven() throws Exception {
101+
public void loginAsksServerFromUserIfNotGiven() {
89102
when(TmcUtil.tryToLogin(eq(ctx), any(Settings.class))).thenReturn(true);
90103
String[] args = {"login", "-p", PASSWORD, "-u", USERNAME};
91104
io.addLinePrompt(SERVER);
92105
app.run(args);
93106
io.assertAllPromptsUsed();
94107
}
108+
109+
@Test
110+
public void serverAndNotAskedAfterLogout() {
111+
TmcSettings settings = new Settings(SERVER, "username", "pass");
112+
CourseInfo info = new CourseInfo(settings, null);
113+
when(TmcUtil.tryToLogin(eq(ctx), any(Settings.class))).thenReturn(true);
114+
when(ctx.getCourseInfo()).thenReturn(info);
115+
String[] args = {"login"};
116+
io.addPasswordPrompt(PASSWORD);
117+
app.run(args);
118+
io.assertAllPromptsUsed();
119+
}
120+
121+
@Test
122+
public void courseInfoValuesOverridedByOptions() {
123+
Settings settings = new Settings(SERVER, "username", "pass");
124+
CourseInfo info = new CourseInfo(settings, null);
125+
when(TmcUtil.tryToLogin(eq(ctx), any(Settings.class))).thenReturn(true);
126+
when(ctx.getCourseInfo()).thenReturn(info);
127+
String[] args = {"login", "-p", PASSWORD, "-u", USERNAME};
128+
app.run(args);
129+
io.assertAllPromptsUsed();
130+
131+
Settings expectedSettings = new Settings(SERVER, USERNAME, PASSWORD);
132+
verifyStatic();
133+
TmcUtil.tryToLogin(eq(ctx), eq(expectedSettings));
134+
}
95135
}

src/test/java/fi/helsinki/cs/tmc/cli/tmcstuff/SettingsTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,24 @@ public void constructorInitializesFields() {
2626
assertEquals("testpassword", settings.getPassword());
2727
}
2828

29+
@Test
30+
public void equalsWorksWithSameValues() {
31+
Settings compared = new Settings("testserver", "testuser", "testpassword");
32+
assertEquals(true, settings.equals(compared));
33+
}
34+
35+
@Test
36+
public void equalsWorksWithNull() {
37+
Settings compared = new Settings(null, "testuser", "testpassword");
38+
assertEquals(false, settings.equals(compared));
39+
}
40+
41+
@Test
42+
public void equalsWorksWithRandomValue() {
43+
Settings compared = new Settings("xyz", "testuser", "testpassword");
44+
assertEquals(false, settings.equals(compared));
45+
}
46+
2947
@Test
3048
public void correctApiVersion() {
3149
assertEquals("7", settings.apiVersion());

0 commit comments

Comments
 (0)